function <T> ジェネリック関数
最終更新:2026-10-22
function <T> ジェネリック関数
ジェネリック関数は型パラメータ <T> で「型」を引数に変えます。同じ1つのロジックが複数の型に対応し、引数と戻り値の型が連動します。any より安全(型情報が保持される)で、型ごとにコードを複製するより手間がかかりません。
| グループ | ジェネリクス |
|---|---|
| 種類 | 構文 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
function identity<T>(value: T): T {
return value;
}
// 複数の型パラメータ + 制約
function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
⚙️ パラメータ
| <T> | 呼び出し時に実引数から推論されるか、明示的に指定します。命名の慣例では T/U/V が汎用型、K がキー、E が要素を表します |
|---|---|
| K extends keyof T | 制約:K は T のキー名のユニオンに限られ、範囲外のキー名はコンパイルエラーになります |
戻り値:型パラメータで表現します——戻り値は引数と同じ型(T)でもよいし、マッピングやインデックスアクセスで導出した型(Pick<T, K>)でもかまいません。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
{"id":1,"name":"Charlie"}
(トランスパイル後の実行出力。keys に "age" を渡すと型エラーになります——K は keyof T で制約されています)
💡 ポイント
ℹ️ 説明 ジェネリックはトランスパイル後に完全に消えます。実行時に T は存在せず、あるのは普通の関数だけです。型の連動はすべてコンパイル時に行われます。
💡 ヒント 戻り値型はできるだけ型パラメータで表現してください(Pick<T, K> など)。手書きの寛容な戻り値型にすると、呼び出し側が得られるのが「連動後の正確な型」でなくなります。
⚠️ 注意 ジェネリックは多ければよいものではありません。単一の型で足りるのに T を書くと読みにくくなるだけです。まず具体的なバージョンを書き、重複が現れてからジェネリックに抽象化しましょう。
🏷️ 関連ジェネリクス
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q ジェネリックと any の違いは何ですか?
A any は型情報を消し去ります(引数と戻り値が断絶し、以後の検査は一切なし)。ジェネリックは型の連動を保持します(identity(42) の戻り値は number)。ジェネリックは「安全な any の代替」です。
Q いつ関数をジェネリックにすべきですか?
A 「引数型と戻り値型に連動がある」か「同じロジックを複数の型に対応させたい」ときです。典型的なサイン:any を書こうとしている、あるいは型ごとに同じ関数をコピー&ペーストしようとしている。
Q <T, K extends keyof T> はどう読めばいいですか?
A 2つの型パラメータの宣言です。T は任意の型、K は T のキー名の1つ(keyof T で制約)。pick(user, ["id"]) を呼ぶと T は user の型、K は "id" になり、戻り値型は { id: number } になります。