типа ? в первом случае получаю never во втором bolean при втором условии он начинает как-то разделять union тип?
type test = boolean | null | string extends string ? boolean : never; //never
type testG<T> = T extends string ? T extends string ? boolean :never : never;
type test1 = testG<boolean | null | string>; //boolean
union шире чем строка. в этом случае string extends string | boolean
boolean | null | string extends string всегда будет false
Эта особенность описана в документации: Distributive conditional types. В отличие от "обычных" условных типов (первый случай) условный тип от типа-параметра (соответственно, внутри дженерика) является дистрибутивным относительно операции объединения. Дистрибутивность здесь означает, что такой условный тип от объединения нескольких частей вычисляется как объединение условных типов по этим частям: (A | B) extends U ? X : Y = (A extends U ? X : Y) | (B extends U ? X : Y). Поэтому во втором и третьем случаях результат будет равен never | never | boolean = boolean. Пример: play.
Обсуждают сегодня