Skip to content

サブタイプとスーパータイプ

型を集合として考えてみる。

以下のコードで考えてみる。

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関数の引数として渡すことができる。