TypeScript 不对用 Array() 构造并用 fill 填充的数组进行类型检查

TypeScript not type checking array constructed with Array() and populated with fill

TypeScript 版本 2.4.2,使用 --target ES6

编译

代码行:

var coins: { coin: number}[] = [1,1,1]

导致 TypeScript 抛出

error TS2322: Type 'number[]' is not assignable to type '{ coin: number; }[]'

但是,行:

var coins: { coin: number}[] = Array(3).fill(1)

编译成功,没有错误。

这是一个 TypeScript 错误,还是它的预期行为(不是对以这种方式声明的数组进行类型检查)?如果是,为什么?

问题是 Array(3) 创建了一个长度为 3 且类型为 any[] 的数组,然后 fill 作用于该数组。由于 any 可以赋值给任何类型,因此 any[] 也可以赋值给任何其他类型的数组(包括 { coin: number}

如果您要为 Array 指定类型参数,您会得到一个错误:

var coins: { coin: number}[] = Array<{ coin: number}>(3).fill(1) // 1 is not assignable to { coin: number}

不幸的是,没有办法防止遗漏数组的类型参数。