在使用对象文字赋值时,TypeScript不会使用界面进行分配

时间:2017-09-27 10:51:22

标签: typescript

为什么要先分配到' a'第二次没有工作。

interface A {
    [k: string]: string | number;
}

interface B {
    p: string;
    d: number;
}

const b: B = {p:"", d:0};
const a: A = b;

const b2 = {p:"", d:0};
const a2: A = b2;

2 个答案:

答案 0 :(得分:1)

这是一个很好的问题。在后一个作业中,b2的类型为{p: string; d: number},其结构上与B匹配,因此可以预期b的前一个作业也可以正常运行。为什么TypeScript推断对象文字的索引签名而不是结构相同的接口?

对于对象文字看起来像implicit index signatures,类型别名自TypeScript v2.0起可用,但它们不会发生在接口上。再次:为什么?

嗯,根据@ RyanCavanaugh最近comment Microsoft/TypeScript#15300的说法:

  

为了填补这些人,这种行为目前正在设计中。因为接口可以通过附加声明来扩充,但是类型别名不能,但它更“安全”(在那个上引用很多)来推断类型别名的隐式索引签名而不是接口。但是,如果这看起来有意义,我们会考虑为接口做这件事。

所以这听起来像他们可能会考虑实施的东西。如果你关心它,你可能想要转到that issue并给它一个或评论你的用例描述,如果它是新的和引人注目的。

希望有所帮助。祝你好运!

答案 1 :(得分:0)

您的界面B没有索引签名。通过将类型b:B分配给a:A打字稿来检查分配将如何进行。您可以通过将索引签名添加到B来修复它,例如

interface B {
    p: string;
    d: number;
    [k: string]: string | number
}