microsoft / microsoft/TypeScript

Type Guard Issue with Array.prototype.fill, Array Constructor

Aperta
#31,785 10 commenti 15 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Awaiting More Feedback Suggestion
Lingua principale
Go
Stelle
111k
Fork
14.3k
Merge medio
1g 19h
PR unite (30g)
117

Descrizione

Typegurd Issue with Array.prototype.fill, Array Constructor

TypeScript Version: 3.5.1

Search Terms:

  • Array.prototype.fill
  • fill
  • ArrayConstructor
  • array implicit any

Code

const foo: number[] = new Array(3).fill("foo"); // accepted

Actual behavior:
This code above is accepted because new Array(3) returns any[], and so fill("foo") returns any[].

I know giving type explicitly to Array like

const foo: number[] = new Array<number>(3).fill("foo"); // error

would work, but I believe the compiler should reject the first one. (This is TypeScript.)

Expected behavior:

Option A. Array.prototype.fill returns narrow type
replace declaration of Array.fill in lib.es2015.core.d.ts like fill<S extends T>(value: S, start?: number, end?: number): S[];, then

const foo: number[] = new Array(3).fill("foo");
// error: "Type 'string[]' is not assignable to type 'number[]'."
// because `fill` is resolved as `fill<string>(value: string, .....): string[]`

const bar = new Array(3).fill(0); // `bar` is resolved as `number[]`
bar.fill("bar"); // error: "Type '"bar"' is not assignable to type 'number'."

const baz: (number|string)[] = new Array(3).fill(0); // accepted.
baz.fill("baz"); // accepted.

Option B. Array Constructor never return implicit any
The problem is that Array constructor returns any[] implicitly. The first code is accepted even with --strict or any other options. It means we always have to care about "Array constructor returns any[]".

Something like #26188 could solve this issue.

Playground Link:
https://www.typescriptlang.org/play/#src=const%20foo%3A%20number%5B%5D%20%3D%20new%20Array(3).fill(%22foo%22)%3B

Related Issues:
#29604

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia riproducendo l’esempio nel TypeScript Playground collegato, quindi leggi le dichiarazioni di Array e ArrayConstructor in lib.es2015.core.d.ts. Esamina le issue correlate #29604 e #26188 e determina quale comportamento proposto è previsto. Il lavoro è concluso quando il comportamento accettato è specificato e coperto dai test TypeScript pertinenti.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
typescript
Ambito
compilers
Tipo di issue
Bug
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.