Open4
keyof neverがすべてのキーになることの図による説明
interface Animal {
name: string;
age: number;
}
interface Dog extends Animal {
breed: string;
}
type AnimalKeys = keyof Animal; // "name" | "age"
type DogKeys = keyof Dog; // "name" | "age" | "breed"
これを見るとkeyof
はX extends Y
のXとYを逆転させている。
X extends Y ==> (keyof Y) extends (keyof X);
Dog extends Animal ==> (keyof Animal) extends (keyof Dog);
↑がneverとunknownに対しても成り立つためには、以下のように定義されるのが自然である。
never extends unknown ==> (keyof never) extends (keyof unknown)
type KeyOfNever = keyof never // string | number | symbol
type KeyOfUnknown = keyof unknown // never
type KeyOfAny = keyof any // never