为什么要先分配到' 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;
答案 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
}