类型脚本中的数组类型

时间:2015-11-10 08:50:08

标签: typescript

为什么TypeScript允许这样做? 我指定了一个数字索引。为什么我可以使用字符串作为索引? Visual Studio不报告错误。

interface StringArray {
    [index: number]: string;

}

var a: StringArray;
a = { "key": "val" };
var b = a["key"];

3 个答案:

答案 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构建选项卡:

Disable allow implicit any

或者在"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

的类型

但是,我认为你有一个好主意。如果您只定义了一个数字索引签名,它似乎不应该被字符串索引访问。