ある型の一部であることを満たす型を作成する(typescript)

JavaScript

以下の様な型を作成したい時、EmployeeがPersonの型を満たしていることを保証したい。

type Person = {
  name?: string
  age?: number
}

type Employee = {
  name: string
  age: number
}

この様に使う。

export type Extends<T, Shape> = T extends Shape
  ? Exclude<keyof T, keyof Shape> extends never
    ? T
    : never
  : never

type Employee = Extends<
  {
    name: string
    age: number
    a: string
  },
  Person
>

この場合、Personにない「a」プロパティが生えているためnever型に推論される。
余分なプロパティが生えてないことを保証したいケースで使ってください。

NGパターン

type Extends<T extends Person> = T
type EmployeeWithExtraProperty = Extends<{
  name: string
  age: number
  a: string
}>

単にTにextendsをつけても同じ様になる気がするが、typescriptがstructural typingなのでa:stringも許容された型になってしまう。

コメント