Microsoft/TypeScript
View on GitHubParentheses in nullish coalescing chains impacts type narrowing
Open
#44,988 opened on Jul 12, 2021
BugDomain: check: Control FlowHelp Wanted
Repository metrics
- Stars
- (48,455 stars)
- PR merge metrics
- (Avg merge 6d 17h) (9 merged PRs in 30d)
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.