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・型クラス