← Назад к вопросам

Что такое объединение типов?

2.2 Middle🔥 171 комментариев
#Другое

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое объединение типов (Union Types)?

Объединение типов (Union Types) — это мощная конструкция систем типов, позволяющая объявлять переменную, параметр функции или возвращаемое значение, которое может принадлежать к одному из нескольких типов. Это ключевой инструмент для описания данных, которые в реальном мире могут принимать различные формы, что повышает типобезопасность и выразительность кода.

Основная идея и синтаксис

В TypeScript объединение типов создается с помощью оператора | (вертикальная черта). Например, переменная может быть либо строкой, либо числом:

let id: string | number;

id = "ABC-123"; // Корректно
id = 1001;      // Корректно
id = true;      // Ошибка: тип boolean не входит в объединение

Формально тип A | B означает, что значение принадлежит либо типу A, либо типу B. Это позволяет явно указать все допустимые варианты, избегая неопределенности типа any.

Практическое применение

1. Параметры и возвращаемые значения функций:

// Функция может принять число или массив чисел
function square(value: number | number[]): number | number[] {
    if (Array.isArray(value)) {
        return value.map(x => x * x);
    }
    return value * value;
}

2. Работа с DOM-элементами:

// Элемент может быть либо HTMLInputElement, либо HTMLTextAreaElement
const input: HTMLInputElement | HTMLTextAreaElement = document.querySelector('.my-field');

3. Моделирование состояний:

type LoadingState = { status: 'loading' };
type SuccessState = { status: 'success', data: User[] };
type ErrorState = { status: 'error', message: string };

type ApiState = LoadingState | SuccessState | ErrorState;

function handleState(state: ApiState) {
    switch (state.status) {
        case 'loading': // ... break;
        case 'success': // ... доступно state.data
        case 'error':   // ... доступно state.message
    }
}

Сужение типов (Type Narrowing)

Ключевой аспект работы с объединениями — сужение типов. Поскольку TypeScript не позволяет выполнять операции, допустимые не для всех членов объединения, необходимо проверять конкретный тип во время выполнения:

function format(value: string | number): string {
    // typeof guards
    if (typeof value === 'string') {
        return value.toUpperCase(); // Здесь value имеет тип string
    }
    // Здесь TypeScript знает, что value имеет тип number
    return value.toFixed(2);
}

// Использование пользовательских type guards
function isString(value: unknown): value is string {
    return typeof value === 'string';
}

Важные особенности

  • Общие операции: Доступны только операции, допустимые для всех типов в объединении (если не выполнено сужение).
  • Пересечение свойств: При обращении к свойству, существующему во всех типах объединения, оно будет доступно без сужения.
  • Дистрибутивность: В условных типах объединения ведут себя дистрибутивно: T extends U ? X : Y для A | B вычисляется как (A extends U ? X : Y) | (B extends U ? X : Y).

Преимущества использования

  1. Повышение типобезопасности: Замена нестрогого any на конкретный набор типов.
  2. Улучшение читаемости: Явное указание всех возможных вариантов прямо в сигнатурах типов.
  3. Более точное моделирование домена: Отражение реальной вариативности данных.
  4. Раннее обнаружение ошибок: Компилятор предотвращает некорректные операции.
  5. Улучшенный автокомплит: После сужения типа IDE предоставляет корректные подсказки.

Объединения типов — фундаментальный паттерн в TypeScript и других статически типизированных языках (как вариантные типы в F#, Rust), позволяющий элегантно описывать сложные предметные области, сохраняя строгость типизации и выразительность кода.

Что такое объединение типов? | PrepBro