Что такое union и intersection types в TypeScript?

JuniorTypeScript · Frontend·Обновлено 21 августа 2026
Коротко
Union type (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 интерфейсов при объединении объектных структур

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Feature-Sliced Design

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.5
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее