microsoft / microsoft/TypeScript
Parentheses in nullish coalescing chains impacts type narrowing
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
nullish coalescing chain parentheses type narrowing prettier
🕗 Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about nullish coalescing. Note that at the time of writing, 4.3.5 was the latest stable release.
⏯ Playground Link
Playground link with relevant code
💻 Code
type T =
| { a: string; b: string }
| { a: string; b?: undefined }
| { a?: undefined; b: string };
const getResult1 = (value1: string | undefined, value2: T): string => {
return value1 ?? value2.a ?? value2.b;
};
const getResult2 = (value1: string | undefined, value2: T): string => {
return value1 ?? (value2.a ?? value2.b);
};
🙁 Actual behavior
getResult1throws a type error, as TypeScript incorrectly infers thatvalue2.bhas a type ofstring | undefined.getResult2does not throw a type error, as TypeScript correctly infers thatvalue2.bhas a type ofstring.
🙂 Expected behavior
The existence and placement of parentheses in nullish coalescing chains should not impact type narrowing, as to my knowledge (and prettier, as it automatically removes the parentheses seen in getResult2), x ?? y ?? z and x ?? (y ?? z) actually behave the same at runtime.
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 Diagnosen für getResult1 und getResult2. Verfolge, wie Nullish-Coalescing-Ketten und Ausdrücke mit Klammern die Typverengung beeinflussen, und füge einen Regressionstest hinzu, der beide äquivalenten Formen abdeckt. Erledigt ist die Aufgabe, wenn beide Formen value2.b als string inferieren und dasselbe akzeptierte Ergebnis liefern.
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
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100