Почему в TypeScript 'T никогда не расширяется? never: keyof T` отличаются от `keyof T '?

Рассмотрим следующие определения:

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`

Я нахожу это озадачивающим. Любая помощь в понимании этого будет принята с благодарностью, спасибо!


person pelrow    schedule 12.05.2021    source источник
comment
Ваш OtherKeyOf<T> является условным распределительным типом, что объясняет разницу в поведении. См. Ответ на другой вопрос для больше информации   -  person jcalz    schedule 12.05.2021
comment
Спасибо @jcalz, это прекрасно это объясняет!   -  person pelrow    schedule 12.05.2021