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