ジェネリクスの型引数 T は、関数の中ではどういう型として扱われますか。
どんな型が入るか分からない型として扱われ、制約が無ければプロパティを読むことも呼ぶこともできません。必要な性質は extends で約束させると、関数の中で使えるようになります。
面接官が見ているのは補強。T について何も分からないから、制約が要ることを理解しているか。
これは「function findById<T>(items: T[], id: string) と書いたら、中で item.id を読むところでエラーになりました。どうしますか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- どんな型が入るか分からないものとして扱われ、制約が無ければプロパティを読めない
その通りです。だから必要な性質は extends で約束させます。 - any として扱われる
any とは違います。T のままでは、プロパティを読むことも呼ぶこともできません。 - 呼び出し側で渡した型として、関数の中でも具体的に扱われる
関数の中からは、どの型で呼ばれるか分かりません。呼び出しごとに決まるのは外から見た型です。 - unknown と同じで、絞り込めば使える
中身が分からない点は近いですが、ジェネリクスの要点は、呼ばれた型を戻り値まで運べることです。
模範解答
関数の中では、T は「どんな型が入るか分からない型」として扱われます。number かもしれないし、文字列かもしれないので、制約が無ければプロパティを読むことも呼ぶこともできません。
必要な性質があるなら、T extends { id: string } のように制約を付けます。そうすると、関数の中では id があるものとして扱え、呼び出し側には id を持つ型しか渡せなくなります。
対象: TypeScript 5.x〜7.0 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。