5

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?

Heretic Monkey
  • 11,687
  • 7
  • 53
  • 122
Rohit Falor
  • 1,254
  • 2
  • 11
  • 17
  • Yeah, I don't think TS has implemented this [yet] – A T Feb 17 '18 at 23:07
  • 1
    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 Feb 17 '18 at 23:08
  • 1
    @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 Feb 17 '18 at 23:19

1 Answers1

5

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.

Titian Cernicova-Dragomir
  • 230,986
  • 31
  • 415
  • 357