为什么这不会触发Typescript编译错误?
interface Test{
blabla?:string,
foo?:number
}
let bad:Test = 1;
在这种情况下,我们如何强制编译错误?
答案 0 :(得分:0)
当所有属性都是可选的时,意味着空对象({}
)也将满足该类型
由于您的Test
可以是空对象,因此任何内容都可以用作Test
:
let a1 = "string" as Test;
let a2 = true as Test;
let a3 = [1, 2] as Test;
let a4 = { key: "value" } as Test;
let a5 = function() { } as Test;
使其工作的唯一方法是向Test
接口添加至少一个非可选属性。
这是因为typescript是based on structural subtyping,这意味着编译器会比较类型结构而不是类型名称。
对于空对象,所有其他“结构”都适合。
答案 1 :(得分:0)
您可以在界面中添加[k: string]: any
:
interface Test{
blabla?:string;
foo?:number;
[k: string]: any
}
let bad:Test = 1; // Type '1' is not assignable to type 'Test'