IT-Q

ジェネリクスの型引数 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
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。