【じぇねりくす】

ジェネリクス とは?

💡 「どんな型でも使えるテンプレート」で型安全を保つ仕組み
📌 このページのポイント
ジェネリクス ― 型パラメータ T の活用 Box<T> T は任意の型 Box<String> "Hello" を格納 Box<Integer> 42 を格納 Box<User> ユーザー情報を格納 型安全 コード再利用 キャスト不要
ジェネリクス(型パラメータ)のイメージ
ひよこ ひよこ

ジェネリクスって何で必要なの?

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

例えば「配列の先頭を返す関数」を作るとき、数値の配列用・文字列配列用…と別々に作るのは無駄だよね。ジェネリクスを使えば「(arr: T[]): T」のように書いて、どの型の配列でも使える1つの関数にできる。

ひよこ ひよこ

anyを使えばいいんじゃないの?

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

anyを使うと型チェックが完全にオフになって、型安全が失われる。ジェネリクスなら「入力がstring[]なら出力もstring」という型の対応関係を保ったまま汎用的にできる。anyとは全然違う。

ひよこ ひよこ

ArrayのTって何?

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

パラメータで、使うときに具体的な型を入れる「型の変数」だよ。ArrayならTがnumberになって数値の配列、ArrayならTがstringになる。命名はTが慣習だけど、意味のある名前(Keyなど)を使っても構わない。

ひよこ ひよこ

パラメータ制約をつけるってどういうこと?

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

「T extends SomeInterface」のように書くと、「SomeInterfaceを実装している型だけTに使える」という制約をつけられる。例えば「T extends { length: number }」なら、lengthプロパティを持つ型(string・配列など)だけが許可される。これを「型制約(Constraints)」という。さらに高度なConditional Types(「T extends U ? X : Y」)を使うとコンパイル時に型を分岐させることもでき、TypeScript型システムが「チューリング完全」と言われる理由の一つになってる。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
ジェネリクスって出てきたら「型をパラメータにした型安全なテンプレート」と思えばだいたいOK!
📖 おまけ:英語の意味
「Generics」 = 汎用的な・一般的な
💬 「Generic(一般的)」から。特定の型に限定しない「一般的な」コードを書けるという意味
← 用語集にもどる