为什么在TypeScript中分配后,对象文字与索引映射不兼容?

时间:2014-01-29 20:03:18

标签: typescript

我在TypeScript代码中遇到了一些奇怪的情况:

var a : { [name: string]: any } = { a: 'A' }; // WORKS!

interface T { [name: string]: any };
var b : T = { a: 'A' };                       // WORKS!

interface Q<a> { [name: string]: a };
var c : Q<any> = { a: 'A' };                  // WORKS!

var d = { a: 'A' };
c = d;                                        // DOESN'T WORK

任何人都可以向我解释它有什么问题吗?

Error   1   Cannot convert '{ a: string; }' to 'Q<any>':
    Index signatures of types '{ a: string; }' and 'Q<any>' are incompatible.   

1 个答案:

答案 0 :(得分:3)

如果您考虑过:

var d = { a: 'A' };

d的类型将被推断为:

var d: { a : string };

要使TypeScript声明两种类型相同,当它们是索引签名时,两者必须是相同类型的相同类型。 (来自规范中的3.8.2)

因此这不起作用:

c = d;   

因为它实际上被视为这两种类型定义:

{ [name: string] : any } = { a : string };

那些不相同(因为它们不是相同的索引签名)。

直接在强类型变量(如c)上创建和设置值时,类型是众所周知的。

如果您添加了另一项测试:

var e: { a: string } = { a: 'A'};
e = d;

您会看到e如何在没有警告的情况下接受d的值。 c = e;

其他集合正在工作,因为您已明确声明了类型,因此正确推断出类型(并且正如您所见)。这种行为就像另一种语言,例如int类型int myVar = 6;6。在这种情况下,int将被视为byte,即使它可能已被表示为{{1}}。