Комментарии 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" не просто так!
отличие типа-объединения от типа-суммы — в том, что
T | T = T
, ноT + T != T
.Прилагательные "tagged" ... появляются перед словом "union" не просто так!
прошу ссылки на литературу, где можно почитать об этом.. не встречал упоминания об иных типах-объединениях.
Ну вот пусть хотя бы https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#union-types
Exclude<T, U>
Утилита создает тип, исключая свойства, которые уже присутствуют в двух разных типах. Он исключает из T все поля, которые можно назначить U.
В документации написано по другому
Constructs a type by excluding from
UnionType
all union members that are assignable toExcludedMembers
.
Речь идет именно про то, что эта утилита Exclude
помогает работать с UnionType
. В примведенном примере и описании к Exclude
этого совсем не упоминается, и даже ноборот запутывает. Появляется вопрос, а зачем использовать Exclude
, если я тоже самое могу сделать с помощью Omit: Omit<A, keyof B>
.
Зная вышеперечисленное несложно решать Type Challenges :)
TypeScript и все что тебе нужно в разработке