共変
共変 (convariant)とは
型の継承関係において、サブタイプがスーパータイプに置き換え可能である性質を指す
AがBのサブタイプであるときA <: Bとなる
主に関数の戻り値に関連する概念
Admin型はUser型のサブタイプ
User型はAdmin型のスーパータイプ
code:typescript
type User = {
name: string
}
type Admin = User & {
permissions: string[]
}
const user: User = {
name: "user",
}
const admin: Admin = {
name: "admin",
permissions: [],
}
code:mermaid
classDiagram
class User {
+name: string
}
class Admin {
+permissions: string[]
}
User ..|> Admin: サブタイプ
User <|-- Admin : is-a
Admin ..|> User: スーパータイプ
関数の戻り値
code:typescript
// admin は User の型を満たすので代入可能
const fn1: () => User = () => admin
// 型エラー。Type 'User' is not assignable to type 'Admin'.
const fn2: () => Admin = () => user
User型を返す関数に、Admin型を返す関数は代入可能
AdminはUserのサブタイプであるため
Admin型を返す関数にUser型を返す関数は代入不可
サブタイプ関係にないため
permissionsプロパティが存在しないためエラーになる