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 } になります。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%