microsoft / microsoft/TypeScript

Type guard does not narrow the same as if-statement

オープン
#33,119 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Awaiting More Feedback Suggestion
主要言語
Go
スター
111k
フォーク
14.4k
平均マージ
1日 19時間
マージ済み PR(30日)
117

説明

TypeScript Version: 3.5.1

Search Terms:

  • Type guard function
  • If-statement guard
  • Narrow
  • Discriminated union

Code

enum E1 {
    element0 = "element0",
    element1 = "element1",
    element2 = "element2",
}
enum E2 {
    element3 = "element3",
    element4 = "element4",
    element5 = "element5",
}

declare const obj : (
    | {
        type : E1,
        data : {
            object : {
                x : "e1"
            }
        }
    }
    | {
        type : E2,
        data : {
            object : {
                x : "e2"
            }
        }
    }
);

if (obj.type == E1.element0) {
    //OK
    const type : "element0" = obj.type;
    //OK
    const x : "e1" = obj.data.object.x;
}

if (
    obj.type == E1.element0 ||
    obj.type == E1.element1 ||
    obj.type == E1.element2
) {
    //OK
    const type : "element0"|"element1"|"element2" = obj.type;
    //OK
    const x : "e1" = obj.data.object.x;
}

declare function isE1 (mixed : unknown) : mixed is E1;

if (isE1(obj.type)) {
    //OK
    const type : "element0"|"element1"|"element2" = obj.type;
    //Expected : OK
    //Actual : Error; Type '"e1" | "e2"' is not assignable to type '"e1"'.
    const x : "e1" = obj.data.object.x;
}

Expected behavior:

2nd and 3rd examples should both work.

Actual behavior:

2nd example works.
3rd example does not work.

Playground Link:

Playground

Related Issues:

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

提供された Playground の再現から始め、直接的な enum チェックとユーザー定義の isE1 型ガードを比較してください。discriminated union に対する TypeScript の制御フローによる narrowing を調査し、期待される結果を確認してください。3 番目の例では、obj.data.object.x が "e1" に絞り込まれるはずです。関連するコンパイラテストの場所が特定できた場合は、回帰テストを追加または更新してください。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
typescript
領域
compilers
issue の種類
バグ
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。