为什么TypeScript允许这样做? 我指定了一个数字索引。为什么我可以使用字符串作为索引? Visual Studio不报告错误。
interface StringArray {
[index: number]: string;
}
var a: StringArray;
a = { "key": "val" };
var b = a["key"];
答案 0 :(得分:4)
<强>问题强>
这是因为编译器仍然允许使用索引访问对象属性时可能发生的隐式any
类型:
// Example 1
let dictionary: { [index: number]: string };
let myStringTypedVar = dictionary[5]; // implicitly typed as "string"
let myAnyTypedVar = dictionary["prop"]; // implicitly typed as "any"
// Example 2
let myNumberTypedVar = 5;
let myAnyTypedVar = myNumberTypedVar["prop"]; // implicitly typed as "any"
修正:使用--noImplictAny
如果使用--noImplictAny
编译示例,则会出错:
tsc --noImplicitAny example.ts
输出:
example.ts(8,9):错误TS7017:对象类型的索引签名隐含地具有&#39; any&#39;类型。
我建议始终使用--noImplicitAny
进行编译。在Visual Studio中,您可以通过取消选中&#34;允许隐式&#39;任何&#39;来启用--noImplictAny
。类型&#34;在项目属性&#39; typescript构建选项卡:
或者在"noImplicitAny": "true"
中将compilerOptions
添加到tsconfig.json
。
答案 1 :(得分:2)
数组也是一个对象。所以你可以访问对象属性。
var array = [];
array.push("One"); // array
array[1]= "Two"; // array
array['key'] = "Three";// object
array.key2 = "Four"; // object
var length = array.length; // Is 2
答案 2 :(得分:1)
数字索引签名仅定义通过数字索引访问的属性的类型。它不会仅限制对数字索引的属性访问。
来自TypeScript 1.5 specification:
使用索引类型编号指定的数字索引签名,为所有人定义类型约束 在包含类型中以数字命名的属性。具体来说,在具有数字索引的类型中 类型为T的签名,所有数字命名的属性必须具有可分配给T
的类型
但是,我认为你有一个好主意。如果您只定义了一个数字索引签名,它似乎不应该被字符串索引访问。