microsoft / microsoft/TypeScript
Mapped type of a conditional type unexpectedly fails inference
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
🔎 Search Terms
conditional type infer unknown
conditional type mapped type inference
🕗 Version & Regression Information
This is the behavior in every version I tried (3.3.3 to 5.5.3), and I reviewed the FAQ for entries about conditional types, mapped types, and structural inference.
⏯ Playground Link
💻 Code
type Mapped<T> = { [P in keyof T]: T[P] }
type ComponentA = Mapped<{ field: number }>
type ComponentB = { field: number }
type Infer1<T> = Mapped<T extends never ? null : T>
declare function infer1<T>(c: Infer1<T>): T
infer1({} as ComponentA).field = 1 // ✅
infer1({} as ComponentB).field = 1 // ❌ Error: Object is of type 'unknown'
type Infer2<T> = T extends never ? null : Mapped<T>
declare function infer2<T>(c: Infer2<T>): T
infer2({} as ComponentA).field = 1 // ✅
infer2({} as ComponentB).field = 1 // ✅
🙁 Actual behavior
infer1(ComponentA) passed inference but infer1(ComponentB) failed with unknown.
However, if it's the other way around — Conditional ? Mapped<T> instead of Mapped<Conditional ? T>, both infer2(ComponentA) and infer2(ComponentB) passed inference.
🙂 Expected behavior
I expect infer1(ComponentA) and infer1(ComponentB) to both work, because ComponentA and ComponentB are essentially the same type — I'm unable to otherwise differentiate them by any means.
Additional information about the issue
I discovered this while debugging vuejs/core#11353, and the interference failure there was eventually reduced to this report.
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
Beginnen Sie mit dem verknüpften TypeScript Playground und dem reduzierten Beispiel infer1/infer2. Vergleichen Sie anschließend, wie die beiden Anordnungen von Conditional Types und Mapped Types T für ComponentA und ComponentB inferieren. Die Aufgabe ist abgeschlossen, wenn infer1 beide äquivalenten Komponentenformen akzeptiert, ohne unknown zu erzeugen, und dieses Verhalten durch einen geeigneten Regressionstest abgedeckt ist.
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
- Klar beschrieben
- Anfängerfreundlichkeit
- 35/100