2016-04-05 16 views
10

Kiểu 1.8 đã đưa vào kiểu chuỗi ký tự. Tuy nhiên, khi đi qua trong một đối tượng như một tham số như trong những điều sau đây:Chữ kiểu chuỗi chữ với đối tượng gõ vịt

const test = { 
    a: "hi", 
    b: "hi", 
    c: "hi" 
}; 

interface ITest { 
    a: "hi" | "bye" 
} 

function testFunc (t: ITest) { 

} 

testFunc(test); 

Nó không thành công với:

Đối số của loại '{a: string; b: chuỗi; chuỗi C; } 'không thể gán cho tham số kiểu' ITest '. Các loại thuộc tính 'a' không tương thích. Nhập 'chuỗi' không thể gán để nhập '' hi "| "tạm biệt"'. Nhập 'chuỗi' không được gán để nhập '' tạm biệt ''.

Tôi hy vọng điều này sẽ hoạt động vì nó đáp ứng các yêu cầu của giao diện, nhưng tôi có thể đang xem xét điều gì đó.

+0

a, b, và c là loại chuỗi thử nghiệm và "chào" | "bye" nhập vào giao diện của bạn. – nullforce

+0

Điều đó có ý nghĩa, mặc dù đó là một chút truy cập trực quan. Cảm ơn. –

Trả lời

12

Loại test.a được suy ra là string chứ không phải "hi". Trình biên dịch so sánh các loại và không phải là biểu thức chuỗi ban đầu.

Để thực hiện việc này, bạn cần phải gõ tài sản đó như "hi" | "bye":

type HiBye = "hi" | "bye"; 

const test = { 
    a: "hi" as HiBye, 
    b: "hi", 
    c: "hi" 
}; 

interface ITest { 
    a: HiBye 
} 

function testFunc (t: ITest) { 
} 

testFunc(test); 

Lưu ý rằng trong trường hợp ban đầu nó sẽ không có ý nghĩa cho các trình biên dịch để suy ra loại test.a"hi" vì bạn có thể chỉ định một giá trị khác cho test.a trước khi nó đạt đến testFunc(test) —ex. test.a = "not hi".

Lưu ý phụ: Trình biên dịch không suy ra loại biểu thức chuỗi cho các biến chuỗi không đổi. Điều đó cũng sẽ dẫn đến rất nhiều phiền toái ... hãy tưởng tượng điều này:

const myVariableTypedAsHi = "hi"; // implicitly typed as "hi" 
let otherVar = myVariableTypedAsHi; // otherVar implicitly typed as "hi" 

otherVar = "test"; // error: cannot assign `"test"` to `"hi"`—well that would be annoying 
Các vấn đề liên quan