我在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.
答案 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}}。