microsoft / microsoft/TypeScript
Order of ReadonlySet/ReadonlyMap in union causes differing key 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
Bug Report
🔎 Search Terms
ReadonlyMap ReadonlySet key inference
🕗 Version & Regression Information
- This is the behavior in every version I tried.
⏯ Playground Link
💻 Code
declare const map: Map<string, number>;
declare function forEachKey<K, T>(map: ReadonlySet<K> | ReadonlyMap<K, any>, callback: (key: K) => T | undefined): T | undefined;
forEachKey(map, (key) => {}) // Error passing "map", key type is wrong (number??)
forEachKey<string, void>(map, (key) => {}) // OK; no error, key type is string
// Now, flip the union order in the parameter's type.
declare function forEachKey2<K, T>(map: ReadonlyMap<K, any> | ReadonlySet<K>, callback: (key: K) => T | undefined): T | undefined;
forEachKey2(map, (key) => {}) // Okay?
forEachKey2<string, void>(map, (key) => {}) // Still okay.
🙁 Actual behavior
The order of the union appears to matter, breaking inference and erroring on valid code. Swapping the union order allows the code to compile.
🙂 Expected behavior
All of this should compile; the union ordering should not matter.
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 der verlinkten TypeScript Playground-Reproduktion und vergleiche die Inferenz für die beiden Union-Reihenfolgen in forEachKey und forEachKey2. Verfolge das Verhalten der generischen Union-Inferenz im Compiler und füge anschließend einen Regressionstest hinzu, der zeigt, dass beide Deklarationen string inferieren und dass alle vier Aufrufe unabhängig von der Reihenfolge der Union kompiliert werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Ruhig
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 48/100