サブタイプとスーパータイプ
型を集合として考えてみる。
以下のコードで考えてみる。
const a: number = 1
const b: number | string = a // OK
number
型の集合はnumber | string
型の集合に含まれる。
このとき、number
型はnumber | string
型のサブタイプである。逆に、number | string
型はnumber
型のスーパータイプである。
これは number <: number | string
と書ける。
とにかく型を集合として考えるというのが重要な気がする
更に深掘る
以下のコードで考えてみる。volume
関数は体積を計算する関数。
type Cubic = { width: number height: number depth: number}
type Quadratic = { width: number height: number}
const volume = (shape: Cubic) => { return shape.width * shape.height * shape.depth}
このとき、Quadratic
型はCubic
型のスーパータイプである。
なぜなら、Quadratic
型の集合に含まれる要素の内、更にdepth
というプロパティを持つ要素がCubic
型の集合を構成するから。
つまり、Cubic <: Quadratic
である。
この時、Cubic
型の値を引数に受け取るvolume
関数にQuadratic
型の値を渡すことはできない。
なぜなら、Quadratic
型の値にはdepth
プロパティを持たない物も存在するから。
視点を変えて言えば、Cubic
型のサブタイプはvolume
関数の引数として渡すことができる。