microsoft / microsoft/TypeScript
Contextual type doesn't apply to elements of array literal spread into another array literal
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.4k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 117
Beschreibung
Bug Report
🔎 Search Terms
spread operator, type inference
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
Playground link with relevant code
💻 Code
interface Test {
field: 'a' | 'b' | 'c'
}
let arr: Test[] = [
{ field: 'c' },
...[
{ field: 'a' }, // field: string
// ^?
{ field: 'b' }, // field: string
// ^?
]
]
function test(...args: Test[]): void {}
test(
{ field: 'c' },
...[
{ field: 'a' }, // field: string
// ^?
{ field: 'b' }, // field: string
// ^?
]
)
🙁 Actual behavior
The types of objects in the array nested through the spread operator is not inferred to be Test, as such inference begins from scratch, so the type of field in those objects becomes string (and is not detected to be 'a' | 'b' | 'c' which I specified in the interface), and a rather cryptic type error is shown:
Type '{ field: string; }' is not assignable to type 'Test'.
Types of property 'field' are incompatible.
Type 'string' is not assignable to type '"a" | "b" | "c"'.
I have also included an example with using the spread operator in a function call for completeness, it generates basically the same error.
I'm not sure if this is really a bug, but regardless, it is trivial to work around by just forcing compiler's hand a little by doing this:
let arr: Test[] = [
{ field: 'c' },
...[
{ field: 'a' as const },
{ field: 'b' as const },
]
]
Which forces the inferred types of the objects to actually be compatible, or assigning the spread array to a variable with an explicitly defined type:
let nested: Test[] = [
{ field: 'a' },
{ field: 'b' },
]
let arr: Test[] = [
{ field: 'c' },
...nested
]
🙂 Expected behavior
I would expect the type of expr3 in [expr1, expr2, ...expr3] to be inferred to be Iterable<T> or something like that provided that we know that the type of elements of the overall array is T. I believe that in my repro it would make types of nested objects to be inferred correctly as Test.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem verknüpften Playground-Repro und bestätige das Verhalten der kontextuellen Typisierung für Array-Literale mit Spreads. Vergleiche es anschließend mit dem Workbench-Repro für den Funktionsaufruf. Als abgeschlossen gilt die Aufgabe, wenn die verschachtelten Objektelemente als kompatibel mit Test inferiert werden, ohne die gezeigten as const- oder separat typisierte-Array-Workarounds, und sich beide Beispiele wie erwartet verhalten.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 25/100