4
votes

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
Yeah, I don't think TS has implemented this [yet] - A T
One of the challenges that TypeScript (or anything like that) faces is that it cannot assume that .fill() is really the stock Array.prototype.fill function. When the code runs, it could be anything. - Pointy
@Pointy not really the issue here. Typescript assumes that the standard functions are not replaces by functions that have a different behavior - Titian Cernicova-Dragomir

1 Answers

4
votes

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.