【かたのしぼりこみ】
型の絞り込み とは?
最終更新:
💡 条件を確かめて、その場所で扱える型を絞る
条件分岐やチェックによって、変数の型をより具体的な型に狭めていく仕組み。TypeScriptなどで安全にユニオン型を扱うための基本テクニック。
📌 このページのポイント
- typeofやinstanceofなどのチェックで、扱う型の候補を絞る
- TypeScriptは分岐・到達可能性・代入を解析する
- 型述語を持つ関数でも絞り込めるが、判定の正しさは必要
- 判別共用体とneverへの代入を使い、分岐漏れを検出できる
型の絞り込みはどういうときに使うの?
例えばstring | numberの変数xで、typeof x === "string"を確認すると、その分岐ではstringとして扱えるよ。値を別の型へ変換するのではなく、その場所で可能な型を絞っているんだ
TypeScriptは制御フロー解析でifやswitchの分岐、returnによる到達可能性、代入などを調べるよ。チェックがあるブロックだけとは限らず、その後に残る型の候補も追うんだ
自分で絞り込みのルールも作れる?
戻り値の型にx is stringのような型述語を指定した関数を作れるよ。例えばunknownの値を受け取り、typeof x === "string"の結果を返す。型述語を書くだけで実行時の検査が追加されるわけではないので、関数の判定を正しく実装する必要があるね
if (x)なら値があると判断できる?
nullやundefinedを除くのに使えることはあるけれど、空文字や0も偽になるよ。空文字を有効な値として扱いたいなら、単なる真偽のチェックでは意図とずれることがある。typeof nullは"object"なので、objectのチェックだけでnullを除けるわけでもないんだ
switchの分岐漏れも見つかるの?
まとめ:ざっくりこれだけ覚えればOK!
「型の絞り込み」って出てきたら「条件などから、その場所で扱える型の候補を絞る仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Type Narrowing」 = 型の絞り込み
💬 Narrow は「狭める」という意味で、広い型を狭い型に絞り込んでいくイメージだよ