Как стать автором
Обновить

Комментарии 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. Они решают одну и ту же задачу, и зачастую случаев взаимозаменимы, но их свойства всё-таки отличаются.

Не вижу по вашей ссылке где именно тип-сумма и тип-объединение являются одним и тем же.


Прилагательные "tagged", "discriminated", "disjoint" и пр. появляются перед словом "union" не просто так!

отличие типа-объединения от типа-суммы — в том, что T | T = T, но T + T != T.

Прилагательные "tagged" ... появляются перед словом "union" не просто так!

прошу ссылки на литературу, где можно почитать об этом.. не встречал упоминания об иных типах-объединениях.

Exclude<T, U>

Утилита создает тип, исключая свойства, которые уже присутствуют в двух разных типах. Он исключает из T все поля, которые можно назначить U.

В документации написано по другому

Constructs a type by excluding from UnionType all union members that are assignable to ExcludedMembers.

Речь идет именно про то, что эта утилита Exclude помогает работать с UnionType. В примведенном примере и описании к Exclude этого совсем не упоминается, и даже ноборот запутывает. Появляется вопрос, а зачем использовать Exclude, если я тоже самое могу сделать с помощью Omit: Omit<A, keyof B> .

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории