TL;DR

型 S の値を、型 T が期待されるどんな文脈でも安全に使えるとき、S は T のサブタイプ(部分型)であるという。S <: T と書く。

なぜ必要か

Wikipedia によると、サブタイピングは多相性の一種で、1 つの値が複数の型に属せるようにする。たとえば整数と実数がどちらも Number のサブタイプなら、Number を受け取る max 関数にどちらも渡せる。

仕組み

どの型がサブタイプになれるかの決め方には 2 種類ある。名前的なサブタイピングでは、特定の方法で宣言した型だけが互いにサブタイプになれる。構造的なサブタイピングでは、2 つの型の構造でサブタイプかどうかが決まる。Effective TypeScript 項目7 では、型を値の集合と考えると、サブタイプは「部分集合」を意味すると説明している。

例

interface Vector1D {
  x: number
}
interface Vector2D extends Vector1D {
  y: number
}
// Vector2D は Vector1D のサブタイプ

注意点

Wikipedia によると、サブタイピングは型(インタフェース)どうしの関係で、継承は実装どうしの関係である。両者は一致することもあるが、別のものである。また、関数型では引数の型が反変、戻り値の型が共変になる。型推論入門によると、Hindley-Milner の型推論はそのままでは部分型を推論できない。

関連

出典