{ a: infer U; b: infer U } ? U : never;
type T1 = Foo<{ a: string; b: string }>;
// ^ = type T1 = string
type T2 = Foo<{ a: string; b: number }>;
// ^ = type T2 = string | number
и:
type Bar<T> = T extends { a: (x: infer U) => void; b: (x: infer U) => void }
? U
: never;
type T1 = Bar<{ a: (x: string) => void; b: (x: string) => void }>;
// ^ = type T1 = string
type T2 = Bar<{ a: (x: string) => void; b: (x: number) => void }>;
// ^ = type T2 = never
Почему первый вариант считается ковариантным и в результате в U попадает объединение типов, а второй считается контравариантным, и поэтому в U попадает пересечение.
Где та неуловимая для меня грань между двумя этими записями, из-за чего первая - ковариантная, а вторая - контравариантая:
T extends { a: infer U; b: infer U }
T extends { a: (x: infer U) => void; b: (x: infer U) => void }
Здесь я вроде уже объяснял: https://t.me/ts_ru/101350
Обсуждают сегодня