
Комментарии 12
Что-то мне кажется что в Excludeу вас закралась ошибка, не хватает уникальных свойств типа В.
Интересно. Пересечение типов больше похоже на теоретико-множественное объединение, а объединение типов - это скорее "тип-сумма".
Пересечение типов больше похоже на теоретико-множественное объединение
Это так выглядит для объектных типов. Объект соответствует заданному типу, если у него есть указанные в типе поля, и неважно, имеются ли какие-то другие. Вот так и выходит, что объект, одновременно соответствующий типам A = {a: T1, c: T3} и B = {b: T2, c: T4}, должен соответствовать типу {a: T1, b: T2, c: T3 & T4}. Так что на самом деле там теоретико-множественное пересечение в чистом виде.
Про пересечение типов вам уже сказали, скажу про объединение.
Принципиальное отличие типа-объединения от типа-суммы — в том, что T | T = T, но T + T != T. Они решают одну и ту же задачу, и зачастую случаев взаимозаменимы, но их свойства всё-таки отличаются.
У некоторых авторов тип-сумма / тип-объединение – это одно и тоже. https://en.wikipedia.org/wiki/Tagged_union
Не вижу по вашей ссылке где именно тип-сумма и тип-объединение являются одним и тем же.
Прилагательные "tagged", "discriminated", "disjoint" и пр. появляются перед словом "union" не просто так!
Exclude<T, U>
Утилита создает тип, исключая свойства, которые уже присутствуют в двух разных типах. Он исключает из T все поля, которые можно назначить U.
В документации написано по другому
Constructs a type by excluding from
UnionTypeall union members that are assignable toExcludedMembers.
Речь идет именно про то, что эта утилита Exclude помогает работать с UnionType. В примведенном примере и описании к Exclude этого совсем не упоминается, и даже ноборот запутывает. Появляется вопрос, а зачем использовать Exclude, если я тоже самое могу сделать с помощью Omit: Omit<A, keyof B> .
Зная вышеперечисленное несложно решать Type Challenges :)
TypeScript и все что тебе нужно в разработке