TypeScript中数组类型的类型检查

时间:2015-05-13 13:23:07

标签: typescript

在TypeScript中可以声明强类型Array Types

但是下一个片段的错误(来自compiller)非常奇怪。有人可以解释我的错误案例吗?

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

var my1: SomeArray1;
my1["ab"] = 12;  // <-- why this line is OK?
my1["ab"] = "ab"; // <-- why this line is OK?
my1[12] = "ab";
my1[12] = 12; // <-- error

//-----------------------------

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

var my2: SomeArray2;

my2["ab"] = 12;
my2["ab"] = "ab"; // <-- error
my2[12] = "ab"; // <-- error
my2[12] = 12;

//-----------------------------

interface SomeArray3 {
    [index: string]: string;
}

var my3: SomeArray3;

my3["ab"] = 12; // <-- error
my3["ab"] = "ab";
my3[12] = "ab";
my3[12] = 12; // <-- error    

playground

中打开示例

1 个答案:

答案 0 :(得分:1)

在我看来,文档很混乱,因为它描述的数组类型并不仅限于数组。例如,允许以下内容:

var my1: SomeArray1 = {};

正在谈论的内容更像是一个键值/ dictionary-like type,在SomeArray1的情况下,键是number,值是{{1} }}

如果它被定义为具有字符串值约束的数组类型,那将更有意义:

string

甚至是类型别名:

var my1: Array<string> = [];

在这两种情况下,都不允许为变量分配type SomeArray1 = Array<string>; var my1: SomeArray1 = [];

值类型约束错误

所有错误都非常相似。它们发生的主要原因是因为存在{}值约束,并且它被分配了string,反之亦然。

索引类型约束......没有错误?

这很奇怪,因为类型约束似乎不适用于索引/键。我确信这曾经有用。这可能是编译器中的错误,也可能是打字稿团队决定更改此错误。我打开了an issue来检查。

回复:

  

我们在这里改变了行为,因为(在运行时)数字在索引操作期间被隐式转换为字符串。基本上,字符串索引器是数字索引器的“超集”。