在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
中打开示例
答案 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来检查。
回复:
我们在这里改变了行为,因为(在运行时)数字在索引操作期间被隐式转换为字符串。基本上,字符串索引器是数字索引器的“超集”。