microsoft / microsoft/TypeScript
Parentheses in nullish coalescing chains impacts type narrowing
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.4k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 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.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked TypeScript Playground reproduction and compare the diagnostics for getResult1 and getResult2. Trace how nullish coalescing chains and parenthesized expressions affect type narrowing, then add a regression test covering both equivalent forms. Done means both forms infer value2.b as string and produce the same accepted result.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100