TypeScript 中数组类型的类型检查

Typechecking of Array Types in TypeScript

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

但是下一个片段的错误(来自编译器)非常奇怪。有人可以向我解释错误情况吗?

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

中打开样本

在我看来,该文档令人困惑,因为它描述的数组类型并不仅仅限于数组。例如,将允许以下内容:

var my1: SomeArray1 = {};

所讨论的更像是一个键值/dictionary-like type,在 SomeArray1 的情况下,键是 number,值是 string.

如果将其定义为具有字符串值约束的数组类型会更有意义:

var my1: Array<string> = [];

甚至类型别名:

type SomeArray1 = Array<string>;
var my1: SomeArray1 = [];

在这两种情况下,都不允许将 {} 分配给变量。

值类型约束错误

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

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

这很奇怪,因为类型约束似乎不适用于 index/key。我确信这曾经有效。这要么是编译器中的错误,要么是打字稿团队决定更改它。我已经打开 an issue 进行检查。


响应:

We changed the behavior here because (at runtime) numbers are implicitly converted to strings during index operations. Basically, a string indexer is a "superset" of a number indexer.