Search code examples
javascripttypescriptissue-trackingtypescript2.4

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


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?


Solution

  • 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.