Microsoft/TypeScript
Auf GitHub ansehenExtra check in expression cause invalid type narrowing
Open
#47.346 geöffnet am 7. Jan. 2022
BugDomain: check: Control FlowHelp Wanted
Repository-Metriken
- Stars
- (48.455 Stars)
- PR-Merge-Metriken
- (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)
Beschreibung
Bug Report
Invalid type narrowing seems to bleed out of expressions that includes "useless" checks, such as :
- checking the existence of a property marked as required
- using optional chaining when the variable is never null
🔎 Search Terms
- invalid type narrowing
- extra condition narrowing
🕗 Version & Regression Information
Tested in 4.4.4, 4.5.4 and 4.6.0-dev.20220107
This seems to be the behavior in every version I tried, and I didn't find any relevant point if the FAQ
⏯ Playground Link
Playground link with relevant code
💻 Code
type A = { a: string };
type B = { a: string; b: string };
// With useless `'a' in x`
declare const value1: A | B;
'a' in value1 && 'b' in value1 && value1.b;
'a' in value1 && 'b' in value1 && value1.b; // Error
// With useless optionnal chaining
declare const value2: A | B;
'b' in value2 && value2?.b;
'b' in value2 && value2.b; // Error
🙁 Actual behavior
In both case, we get the error Property 'b' does not exist on type 'never'.(2339)
The variable is narrowed to A after the first expression, which cause the next one to fail.
🙂 Expected behavior
No type narrowing should occur outside of the expressions.