【かたすいろん】

型推論 とは?

最終更新:
💡 書かなくても、コンパイラが空気を読んでくれる型付け

型注釈を省略した変数や式などについて、コンパイラや型検査器が初期値・使われ方・文脈から型を求める仕組み。推論できる範囲や規則は言語によって異なる。

📌 このページのポイント
コードから型を求める TypeScriptの例 型注釈を省略 let x = 42; let s = "hello"; 推論した型 x: number s: string 推論 後から型と合わない値を代入すると… x = "hello"; number に string は代入できない 省略しても、推論された型で検査する 情報不足なら型注釈が必要なこともある
初期値からの推論例。すべての場所で型を推論できるとは限らず、TypeScriptではanyによって検査が弱まる場合もある。
ひよこ ひよこ
型推論って、型を書かなくていいってこと?
ペンギン先生 ペンギン先生
推論できる場所では省略できるよ。TypeScriptなら let x = 42 のxはnumber型になる。型を書いていなくても、その後に文字列を代入すれば型の不一致を検出できるんだ。
ひよこ ひよこ
じゃあ動的型付けと同じなの?
ペンギン先生 ペンギン先生
型注釈を省けることと、いつ型を検査するかは別だよ。TypeScriptやRustでは、実行前に推論した型を使って検査する。実行時の値に応じて操作を扱う動的型付けと、同じ仕組みではないんだ。
ひよこ ひよこ
どんな情報から推論するの?
ペンギン先生 ペンギン先生
初期値や関数の戻り値だけでなく、式が置かれた文脈も使うよ。TypeScriptでは、既知の配列に渡すコールバックの引数などを推論できる。Rustでも値と使われ方から推論するけれど、候補が複数あれば注釈が必要になることがあるんだ。
ひよこ ひよこ
でも全部推論に任せて大丈夫なのかな?
ペンギン先生 ペンギン先生
型が意図と合うかは確認しよう。TypeScriptでは情報不足でanyになる場合があり、十分な型検査ができなくなる。noImplicitAnyで暗黙のanyをエラーにできるよ。公開する関数の戻り値などに注釈を付けると、意図の文書化や変更の検知にも役立つね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「型推論」って出てきたら「コンパイラが型を自動で察してくれる機能」と思えればだいたいOK!
📖 おまけ:英語の意味
「Type Inference」 = 型の推論
💬 Infer は「推測する」という意味で、コンパイラがコードの文脈から型を推測するイメージだよ

参考資料

← 用語集にもどる