以下编译并运行得很好。但在我看来,接口声明说索引应该是类型编号。但我在这里使用了一个字符串。
有没有理由我没有收到编译错误?
interface Dictionary {
[index: number] : string;
}
var dictionary : Dictionary = {};
dictionary["First"] = "apple";
console.log(dictionary["First"]);
答案 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'."
如果索引签名与对象文字中的属性赋值不匹配,则在没有上下文类型的情况下处理它(忽略没有错误),假设它与实际属性不匹配。