generics を使うと、型でパラメータ化された再利用可能なコードを書けます。これは、コードが使われるときに埋められる「型変数」です。generics は、型安全性を失うことなく 再利用をもたらします(代替手段である any は型安全性を失います)。
ts
(): { arr[]; }
first<T>(: T[]): T { arr[]; }
n = ([, , ]);
s = ([, ]);
generics を使うと、型でパラメータ化された再利用可能なコードを書けます。これは、コードが使われるときに埋められる「型変数」です。generics は、型安全性を失うことなく 再利用をもたらします(代替手段である any は型安全性を失います)。
(): { arr[]; }
first<T>(: T[]): T { arr[]; }
n = ([, , ]);
s = ([, ]);
T はプレースホルダーです。TypeScript は引数からそれを 推論(infer) するため、戻り値の型は正確になります。first([1,2]) は any ではなく number を返します。
interface ApiResponse<T> { data: T; status: number; }
const res: ApiResponse<User> = await getUser(); // res.data is User
class Box<T> {
constructor(private value: T) {}
get(): T { return this.value; }
}
const box = new Box(123); // Box<number>
function pair<K, V>(k: K, v: V): [K, V] { return [k, v]; }
pair("id", 42); // [string, number]
generics は、TypeScript におけるほぼすべての再利用可能な抽象化を支えています。Array<T>、Promise<T>、Map<K,V>、React の useState<T>、データ取得ユーティリティ、コレクションなどです。
generics により、1 つの実装が多くの型に対して機能しつつ、入力から出力までの完全な型情報を保持できます。入力と出力の型の関係は、消去されることなく維持されます。