Задать вопрос
@ivan0512

Какая логика работы intersection и union типов?

Как я понял, после чтения про данные типы к ним нужно относиться как будто это множества. То есть | может объединять два множества, а & находит их пересечение. Данный пример подтверждает данную логику. При помощи перечисления тип string отбрасывается
type A = number | string;
type B = A & number; // number


Однако у меня возникает вопрос при рассмотрении второго случая. Если вместо примитивных типов взять объекты. Здесь & уже находит не пересечение ({ a: number }), а объединяет два объекта . Что кажется для меня ошибкой. Понимаю, что где-то глупо ошибаюсь, но не могу понять где
type C = { a: number } | { b: number };
type D = C & { a: number };

const test2: D = {
  a: 1,
  b: 2
}
  • Вопрос задан
  • 65 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Вы неправильно поняли. Просто читайте | как "или", а & - как "и".

number | string значит, что переменная содержит либо число, либо строку.

number &string значит, что переменая будет и числом и строкой одновременно. И не важно, как это реализовано, и реализуемо ли в принципе (нет).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Понимаю что вопрос задан давно, но все-таки оставлю тут свой ответ тоже.

По поводу пересечения объектных типов да вы запутались.
Вы посчитали что объектный тип - это множество его свойств, то есть например
{ a: number } & { b: number } по вашей логике не имеет пересечения
тк у него нету совпадающих свойств

Но TS работает не так. Тип в TS это множество возможных значений (не свойств).
Именно поэтому когда мы создаем тип такой
{ a: number } & { b: number } то результатом будет такой новый тип
{ a: number, b:number } потому что именно такой тип подойдет для множества значений
которые будут и Первым и вторым типами одновременно.
вот пример таких значений
[{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}]
{a:1} - уже не подходит в нем нету b свойства.

Сам сегодня вспомнил эту тему и думал может написать вопрос на тостер.
но увидел этот вопрос и решил дополнить его.

По поводу пересения такого number &string результатом будет пустое множество never
потому что не может быть множества значений которые одновременно и number и string
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы