当所有属性都是可选的时,为什么不能遵守接口类型?

时间:2016-12-15 14:35:11

标签: typescript interface

为什么这不会触发Typescript编译错误?

interface Test{
    blabla?:string,
    foo?:number
}
let bad:Test = 1;

在这种情况下,我们如何强制编译错误?

2 个答案:

答案 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'