Рассмотрим следующие определения:
type OtherKeyOf<T> = T extends never ? never : keyof T;
type OtherKeyOf2<T> = keyof T;
Я ожидал, что OtherKeyOf
и OtherKeyOf2
будут действовать точно так же, как я ожидал, что эти две функции будут действовать точно так же:
const f1 = (t) => false ? false : "some_value";
const f2 = (t) => "some_value";
Однако этого не происходит. Учитывая некоторые фиктивные типы A
и B
:
interface A {
aMem: number;
}
interface B {
bMem: string;
}
Получаю следующие результаты:
let x: OtherKeyOf<A | B>; // <= the type of x is `"aMem" | "bMem"`
let y: OtherKeyOf2<A | B>; // <= the type of y is `never`
Я нахожу это озадачивающим. Любая помощь в понимании этого будет принята с благодарностью, спасибо!
OtherKeyOf<T>
является условным распределительным типом, что объясняет разницу в поведении. См. Ответ на другой вопрос для больше информации - person jcalz   schedule 12.05.2021