Type guard does not narrow the same as if-statement
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 25/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 停滞
- 技術スタック
- typescript
- 領域
- compilers
調査の方向性
提供された Playground の再現から始め、直接的な enum チェックとユーザー定義の isE1 型ガードを比較してください。discriminated union に対する TypeScript の制御フローによる narrowing を調査し、期待される結果を確認してください。3 番目の例では、obj.data.object.x が "e1" に絞り込まれるはずです。関連するコンパイラテストの場所が特定できた場合は、回帰テストを追加または更新してください。
索引モデルが issue の本文から書いたものです。
説明
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:
Related Issues:
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 15時間
- マージ済み PR(30日)
- 106
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
microsoft/TypeScript のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
microsoft/TypeScript#64322 · コメント 2 件 · リアクション 1 件 · 担当者 2 名 ·
-
Possible Improvement
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
microsoft/TypeScript#64278 · コメント 1 件 · リアクション 1 件 ·
-
Docs
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
microsoft/TypeScript#64118 · コメント 1 件 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
microsoft/TypeScript#64094 ·
-
Docs
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
microsoft/TypeScript#63959 · コメント 5 件 ·
microsoft/TypeScript の issue をすべて見る
似ている issue
-
Type/Bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
OpenNSW/nsw-srilanka#497 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
milvus-io/birdwatcher#545 ·
-
kind/bug
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
kubernetes-sigs/prow#953 · コメント 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
caddyserver/caddy#8046 ·