サブタイプとスーパータイプ
型を集合として考えてみる。
以下のコードで考えてみる。
const a: number = 1
const b: number | string = a // OKnumber型の集合は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関数の引数として渡すことができる。