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

271 views Asked by At

TypeScript version 2.4.2, compiled with --target ES6

The line of code:

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

causes TypeScript to throw

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

However, the line:

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

compiles successfully, without errors.

Is this a TypeScript bug, or is it intended behavior (not type checking an array declared in this manner)?. If so, why?

1

There are 1 answers

0
Titian Cernicova-Dragomir On BEST ANSWER

The problem is that Array(3) creates an array of length 3 and type any[] and then fill acts on that array. Since any can be assigned to any type, any[] can also be assigned to any other typed array (including { coin: number})

If you were to specify the type parameter for Array you would get an error:

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

There is no way to prevent the omission of the type argument for the array unfortunately.