microsoft / microsoft/TypeScript
Parentheses in nullish coalescing chains impacts type narrowing
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.4k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
Description
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.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par la reproduction liée dans TypeScript Playground et comparez les diagnostics de getResult1 et getResult2. Suivez l’effet des chaînes de nullish coalescing et des expressions parenthésées sur le narrowing des types, puis ajoutez un test de régression couvrant les deux formes équivalentes. C’est terminé lorsque les deux formes infèrent value2.b comme étant de type string et produisent le même résultat accepté.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100