-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Open
Labels
BugA bug in TypeScriptA bug in TypeScriptDomain: Control FlowThe issue relates to control flow analysisThe issue relates to control flow analysisHelp WantedYou can do thisYou can do this
Milestone
Description
π Search Terms
"union type", "narrowing", "inverted", "4.9"
π Version & Regression Information
- This changed between versions 4.8.4 and 4.9.5 (probably caused by Optimize substitution typesΒ #50397?)
β― Playground Link
π» Code
interface Foo { foo: string; }
interface Bar { bar: string; }
interface Baz { baz: string; }
function myFunction(input: Foo | Bar | Baz) {
const isBaz = 'baz' in input;
const isBar =
//'bar' in input; // This works to narrow `bar` when true and narrow `foo` in the else block
!('foo' in input) && !isBaz; // This works to narrow `bar` when true but does not narrow `foo` in the else block
let x: string;
if (isBaz) {
x = input.baz;
} else if (isBar) {
x = input.bar;
} else {
// In 4.8.4 and earlier, `input` is narrowed to `Foo`
// In 4.9.5 and later, `input` is narrowed to `Foo | ((Foo | Bar) & Record<"baz", unknown>)`
x = input.foo;
}
}
π Actual behavior
In 4.9.5 and later, in the else block, input.foo
incorrectly narrows and errors
π Expected behavior
In 4.8.4 and earlier, in the else block, input.foo
correctly narrows
Additional information about the issue
No response
Metadata
Metadata
Assignees
Labels
BugA bug in TypeScriptA bug in TypeScriptDomain: Control FlowThe issue relates to control flow analysisThe issue relates to control flow analysisHelp WantedYou can do thisYou can do this