以下の様な型を作成したい時、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も許容された型になってしまう。
コメント