反変
反変(contravariant)とは
型の継承関係において、スーパータイプがサブタイプの代わりに使用できる性質を指す
AがBのサブタイプであるときA >: Bとなる
主に関数の引数に関連する概念
Admin型はUser型のサブタイプ
User型はAdmin型のスーパータイプ
code:typescript
type User = {
name: string
}
type Admin = User & {
permissions: string[]
}
code:mermaid
classDiagram
class User {
+name: string
}
class Admin {
+permissions: string[]
}
User ..|> Admin: サブタイプ
User <|-- Admin : is-a
Admin ..|> User: スーパータイプ
AdminはUserのサブタイプであり、AdminはUserとして扱うことができる
code:typescript
// 共変: AdminをUserとして扱える
let user: User = admin;
関数の引数
code:typescript
// 型エラー。Type '(arg: Admin) => void' is not assignable to type '(arg: User) => void'.
const fn3: (arg: User) => void = (arg: Admin) => {};
// OK
const fn4: (arg: Admin) => void = (arg: User) => {};
Userを受け取る関数にAdmin の変数を渡すことは不可
User型にはpermissionsプロパティが存在しないため、スーパータイプ(User)をサブタイプ(Admin)として扱えない Adminを受け取る関数にUserの変数を渡すことは可能
Admin型には、部分的にUser型の要素を持っている(nameプロパティ)を持っているため、スーパータイプ(User)をサブタイプ(Admin)として扱える