Что такое union и intersection types в TypeScript?
A | B) означает, что значение может быть либо типом A, либо типом B; intersection type (A & B) означает, что значение должно одновременно удовлетворять и типу A, и типу B.Union types
Union type (тип-объединение) описывается через символ | и означает, что значение может принадлежать одному из перечисленных типов.
let id: string | number;
id = "abc123"; // допустимо
id = 123; // допустимо
id = true; // ошибка компиляции
При работе с union-типом TypeScript разрешает обращаться только к тем свойствам и методам, которые есть у всех типов из объединения. Чтобы получить доступ к специфичным для конкретного типа возможностям, нужно сузить тип (type narrowing) — например, с помощью typeof, instanceof или проверки на дискриминирующее поле.
function printId(id: string | number) {
if (typeof id === "string") {
// здесь id точно string
console.log(id.toUpperCase());
} else {
// здесь id точно number
console.log(id.toFixed(2));
}
}
Intersection types
Intersection type (тип-пересечение) описывается через символ & и объединяет несколько типов в один — итоговое значение должно удовлетворять всем типам сразу, то есть содержать все их поля и методы.
type Person = {
name: string;
};
type Employee = {
companyName: string;
};
type Worker = Person & Employee;
const worker: Worker = {
name: "Анна",
companyName: "PurpleSchool",
}; // нужны поля из обоих типов
Intersection часто применяют для расширения типов, композиции миксинов (mixins) и добавления пропсов в компонентах. Если пересекаются типы с примитивами, которые не могут существовать одновременно (например, string & number), результатом будет тип never, потому что ни одно значение не может удовлетворять обоим требованиям.
Основные отличия
- Union (
|) — значение соответствует хотя бы одному из типов, набор допустимых значений расширяется. - Intersection (
&) — значение соответствует всем типам сразу, набор требований к значению сужается. - Union чаще используют для описания вариативности входных данных (аргументы функций, состояния).
- Intersection чаще используют для комбинирования и расширения объектных типов.
Где это применяется на практике
Union типы удобны для описания статусов, результатов запросов или пропсов компонентов с разными вариантами. Часто их комбинируют с дискриминирующим полем (discriminated union), чтобы TypeScript мог точно понимать, какой вариант используется в конкретной ветке кода.
Intersection типы применяют, когда нужно объединить несколько независимых наборов свойств в один составной тип, например при расширении базового интерфейса дополнительными полями без использования наследования.
Что хочет услышать интервьюер
Кандидат чётко формулирует разницу: union — 'один из', intersection — 'все сразу'
Приводит корректный синтаксис с операторами | и &
Понимает, что для union-типа доступны только общие свойства без сужения типа
Может привести пример практического применения (например discriminated union)
Знает, что пересечение несовместимых примитивов даёт тип never
Пример: Union type и сужение типа
type Status = "loading" | "success" | "error";
function render(status: Status) {
if (status === "loading") {
console.log("Загрузка...");
} else if (status === "success") {
console.log("Готово!");
} else {
console.log("Произошла ошибка");
}
}
Пример: Intersection type для расширения объекта
interface WithId {
id: number;
}
interface WithTimestamp {
createdAt: Date;
}
type Entity = WithId & WithTimestamp;
const entity: Entity = {
id: 1,
createdAt: new Date(),
};
Типичные ошибки
Путают операторы: считают, что | объединяет свойства, а & выбирает один из вариантов
Пытаются обратиться к свойству, специфичному только для одного типа из union, без предварительного сужения типа
Не знают о type narrowing (typeof, instanceof, discriminated union) и не могут объяснить, как безопасно работать с union
Не понимают, почему intersection примитивных несовместимых типов даёт never
Путают intersection типов с union интерфейсов при объединении объектных структур


