Как я понял, после чтения про данные типы к ним нужно относиться как будто это множества. То есть | может объединять два множества, а & находит их пересечение. Данный пример подтверждает данную логику. При помощи перечисления тип 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
}