Microsoft/TypeScript

Extra check in expression cause invalid type narrowing

オープン

#47,346 opened on 2022/01/07

 (3 件のコメント) (1 件のリアクション) (0 人の担当者)TypeScript (13,395 件のフォーク)batch import
BugDomain: check: Control FlowHelp Wanted

Repository metrics

Stars
 (108,860 個のスター)
PR merge metrics
 (PR metrics pending)

説明

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.

コントリビューターガイド