Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое объединение типов (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).
Преимущества использования
- Повышение типобезопасности: Замена нестрогого
anyна конкретный набор типов. - Улучшение читаемости: Явное указание всех возможных вариантов прямо в сигнатурах типов.
- Более точное моделирование домена: Отражение реальной вариативности данных.
- Раннее обнаружение ошибок: Компилятор предотвращает некорректные операции.
- Улучшенный автокомплит: После сужения типа IDE предоставляет корректные подсказки.
Объединения типов — фундаментальный паттерн в TypeScript и других статически типизированных языках (как вариантные типы в F#, Rust), позволяющий элегантно описывать сложные предметные области, сохраняя строгость типизации и выразительность кода.