我在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. 发布于 2014-01-30 04:52:10
如果你考虑过:
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。
https://stackoverflow.com/questions/21441429
复制相似问题