【かたのしぼりこみ】

型の絞り込み とは?

💡 if文ひとつで、曖昧な型がピンポイントに変わる魔法
📌 このページのポイント
型の絞り込み(Type Narrowing) string | number typeof x === "string" ? true → string に絞り込み x.toUpperCase() ✓ x.toFixed() ✗ false → number に絞り込み x.toFixed() ✓ x.toUpperCase() ✗ 型ガード: typeof / instanceof / in / カスタム型ガード関数 条件チェックにより、コンパイラが自動的に型を絞り込む
型の絞り込みのイメージ
ひよこ ひよこ

型の絞り込みってどういうときに使うの?

ペンギン先生 ペンギン先生

たとえば string | number というユニオン型の変数があるとき、typeof で string かどうか調べると、そのブロック内では string 型として扱えるようになるんだよ

ひよこ ひよこ

コンパイラがそこまで理解してくれるんだね!

ペンギン先生 ペンギン先生

そうだよ。TypeScriptコンパイラは制御フロー解析をしていて、if文やswitch文の分岐に応じて型を自動的に絞り込んでくれるんだ

ひよこ ひよこ

自分で絞り込みのルールを作ることもできるの?

ペンギン先生 ペンギン先生

できるよ。TypeScriptでは is キーワードを使った型ガード関数を定義できる。たとえば function isString(x: unknown): x is string みたいに書くんだ

ひよこ ひよこ

絞り込みをサボるとどうなるの?

ペンギン先生 ペンギン先生

型が広いままだと、その型にないプロパティにアクセスしようとしてコンパイルエラーになるね。逆に言えば、コンパイラが守ってくれてるんだ。never型を使った網羅性チェックと組み合わせると、switchのcase漏れもコンパイル時に検出できるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「型の絞り込み」って出てきたら「条件分岐で型を具体的に特定するテクニック」と思えればだいたいOK!
📖 おまけ:英語の意味
「Type Narrowing」 = 型の絞り込み
💬 Narrow は「狭める」という意味で、広い型を狭い型に絞り込んでいくイメージだよ
← 用語集にもどる