11.1 ジェネリクス
型を引数として受け取る仕組みです。
function first<T>(values: T[]): T | undefined {
return values[0];
}
Tには実際の型が入ります。
first<number>([1, 2, 3]);
first<string>(["a", "b"]);
同じ処理を型安全に再利用できます。
11.2 制約付きジェネリクス
どの型でもよいのではなく、特定の能力を持つ型だけを受け取ります。
function getLength<T extends { length: number }>(
value: T
): number {
return value.length;
}
RustではTrait boundを使います。
fn print_value<T: Display>(value: T) {
println!("{value}");
}
これは「Displayとして表示できる型だけを受け取る」という意味です。
11.3 多相
同じ操作を異なる型へ適用できる性質です。
サブタイプ多相
AnimalとしてDogやCatを扱う
パラメトリック多相
List<T>
Option<T>
Result<T, E>
ジェネリクスによる多相です。
アドホック多相
型に応じて異なる実装を選びます。
演算子オーバーロード
関数オーバーロード
Trait・型クラス