ジェネリクス
型をパラメータ化し、型安全性を保ちながら汎用的なコードを書く仕組み
ジェネリクスとは
ジェネリクス (Generics) は、型をパラメータ化し、型安全性を保ちながら汎用的なコードを書く仕組みである。any を使わずに、様々な型で動作する関数やクラスを定義できる。
基本
基本のコード例を示す。
// ❌ any: 型安全性がない
function first(arr: any[]): any { return arr[0]; }
// ✅ ジェネリクス: 型安全
function first<T>(arr: T[]): T | undefined { return arr[0]; }
first([1, 2, 3]); // number | undefined
first(['a', 'b', 'c']); // string | undefined
制約 (extends)
制約 (extends) のコード例を示す。
// T は length プロパティを持つ型に制限
function longest<T extends { length: number }>(a: T, b: T): T {
return a.length >= b.length ? a : b;
}
longest('hello', 'world'); // ✅ string は length を持つ
longest([1, 2], [1, 2, 3]); // ✅ 配列は length を持つ
longest(1, 2); // ❌ number は length を持たない
複数の型パラメータ
複数の型パラメータのコード例を示す。
function map<T, U>(arr: T[], fn: (item: T) => U): U[] {
return arr.map(fn);
}
map([1, 2, 3], n => n.toString()); // string[]
ジェネリクスの実用例
API レスポンスの型
interface ApiResponse<T> {
data: T;
status: number;
message: string;
}
async function fetchApi<T>(url: string): Promise<ApiResponse<T>> {
const res = await fetch(url);
return res.json();
}
const { data } = await fetchApi<User[]>('/api/users');
// data の型: User[]
DynamoDB のリポジトリ
interface Repository<T> {
findById(id: string): Promise<T | null>;
save(item: T): Promise<void>;
}
class DynamoDBRepository<T> implements Repository<T> {
constructor(private tableName: string) {}
async findById(id: string): Promise<T | null> { /* GetItem を実行 */ return null; }
async save(item: T): Promise<void> { /* PutItem を実行 */ }
}
const userRepo = new DynamoDBRepository<User>('users');
const orderRepo = new DynamoDBRepository<Order>('orders');
実装側のメソッドで戻り値型を省くと、推論結果 (上の例なら Promise<void>) がインターフェースの Promise<T | null> と食い違い、implements の時点でコンパイルエラーになる。ジェネリックなクラスでは戻り値型を明示するのが安全である。
ユーティリティ型
ユーティリティ型を以下にまとめる。
| 型 | 説明 |
|---|---|
Partial<T> | 全プロパティをオプショナルに |
Required<T> | 全プロパティを必須に |
Pick<T, K> | 指定プロパティだけ抽出 |
Omit<T, K> | 指定プロパティを除外 |
Record<K, V> | キーと値の型を指定したオブジェクト |
type UserUpdate = Partial<Pick<User, 'name' | 'email'>>;
// { name?: string; email?: string }
ジェネリクスの理解を深めるには関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
TypeScript
JavaScript に静的型付けを追加した言語で、大規模開発の安全性と生産性を向上させる
型の絞り込み
TypeScript の型ガードや制御フロー分析で、ユニオン型をより具体的な型に絞り込む手法
抽象クラス
直接インスタンス化できず、サブクラスに共通のインターフェースと部分的な実装を提供するクラス
Trait
Rust の型に共通の振る舞いを定義するインターフェース機構
Builder パターン
複雑なオブジェクトの生成をメソッドチェーンで段階的に構築するデザインパターン
Lambda Powertools
Lambda 関数の構造化ログ、分散トレーシング、カスタムメトリクスを簡素化する AWS 公式ライブラリ
関連する記事
読む前にパラパラめくるだけで理解度が上がる - 技術書の予習法
技術書を最初から順に読み始めると挫折しやすい。読む前に数分パラパラめくるだけで全体像がつかめ、本文で迷って戻る回数が減る理由とやり方を解説。
セキュリティ本ガイド - Web 開発者が読むべき技術書の選び方
Web セキュリティの基礎から実践まで学べる技術書の選び方マトリクスと、読了後にやるべき 3 つのアクションを紹介します。
AWS 本の選び方 - 全体像 / 構築 / 設計 / 運用 / セキュリティの 5 視点
AWS を学ぶ技術書の選び方を「全体像 / 構築 / 設計 / 運用 / セキュリティ」の 5 視点で整理。公式ドキュメントと本の役割分担、資格対策書の位置づけまで、2026 年 8 月時点の定番書で AWS 独学のルートを解説します。