Type narrowing context is lost within closures · Issue #46118 · microsoft/TypeScript (original) (raw)

Bug Report

🔎 Search Terms

typescript union typed narrowing lost in closures
type narrowing closures

🕗 Version & Regression Information

Typescript versions 4.4.3 and still exists on Nightly 4.5.0-dev

Playground link with relevant code

💻 Code

type MyUnion = { type: 'left', propertyExistsOnLeft: string } | { type: 'right', propertyExistsOnRight: string }

let x = {} as MyUnion;

switch (x.type) { case 'left': const y = x.propertyExistsOnLeft; //all good here ... console.log(() => x.propertyExistsOnLeft) //showing error "Property 'propertyExistsOnLeft' does not exist on type 'MyUnion'" break; }

🙁 Actual behavior

Type narrowing is working as expected when following control flow, however when the variable is used inside a closures scope (arrow functions or normal functions) it reverts back to it's declared type losing all narrowing inferred from the containing scope.

🙂 Expected behavior

Type narrowing should continue to work inside the context of closures.