这应该是编译错误吗?

时间:2014-02-22 21:36:44

标签: typescript

以下编译并运行得很好。但在我看来,接口声明说索引应该是类型编号。但我在这里使用了一个字符串。

有没有理由我没有收到编译错误?

interface Dictionary {
[index: number] : string;
}

var dictionary : Dictionary = {};
dictionary["First"] = "apple";

console.log(dictionary["First"]);

1 个答案:

答案 0 :(得分:4)

这是关于索引签名的一个微妙的事情。使用带索引签名的接口时:

[index: number] : string

这意味着只要有一个number的索引,就必须将其设置为string值。它不会将对象实例仅限制为number。如果有数字,则必须设置为string

根据规范(当前3.7.4索引签名):

  

使用索引类型编号指定的数字索引签名define   对所有数字命名属性的类型约束   包含类型。具体来说,在具有数字索引的类型中   类型为T的签名,所有数字命名的属性都必须具有类型   这是T的子类型。

如果您要将界面更改为:

[index: number]: number;

并添加一行:

dictionary[1] = "apple";

将出现编译错误:"Cannot convert 'string' to 'number'."

如果索引签名与对象文字中的属性赋值不匹配,则在没有上下文类型的情况下处理它(忽略没有错误),假设它与实际属性不匹配。