Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Перечисления (Enum) в TypeScript
Enum (enumeration) — это специальный тип в TypeScript, который позволяет определить набор именованных констант. Перечисления используются для создания читаемого кода и предотвращения ошибок при работе с фиксированным набором значений.
Основное назначение
Enum решают следующие задачи:
- Повышение читаемости кода — вместо магических чисел или строк используются имена
- Типизация — ограничение возможных значений переменной
- Автодополнение в IDE — лучшая поддержка редактора
- Предотвращение ошибок — невозможно передать недопустимое значение
Числовые перечисления
enum Status {
Active = 1,
Inactive = 2,
Pending = 3
}
const userStatus: Status = Status.Active; // 1
console.log(userStatus); // 1
console.log(Status[1]); // 'Active' — обратное преобразование
Если не указывать значения, TypeScript автоматически нумерует с 0:
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right // 3
}
Строковые перечисления
Для лучшей читаемости при логировании используют строки:
enum Role {
Admin = 'ADMIN',
User = 'USER',
Guest = 'GUEST'
}
const userRole: Role = Role.Admin; // 'ADMIN'
console.log(userRole); // 'ADMIN'
// Обратное преобразование НЕ работает для строк
// Role['ADMIN'] вернёт undefined
Гетерогенные перечисления
Можно смешивать строки и числа (не рекомендуется):
enum Mixed {
No = 0,
Yes = 'YES',
Maybe = 2
}
Вычисляемые значения
enum Permissions {
Read = 1 << 0, // 1
Write = 1 << 1, // 2
Execute = 1 << 2 // 4
}
const myPerms: Permissions = Permissions.Read | Permissions.Write;
Практический пример в Node.js
// HTTP методы
enum HttpMethod {
GET = 'GET',
POST = 'POST',
PUT = 'PUT',
DELETE = 'DELETE',
PATCH = 'PATCH'
}
// Статусы заказа
enum OrderStatus {
Pending = 'PENDING',
Processing = 'PROCESSING',
Shipped = 'SHIPPED',
Delivered = 'DELIVERED',
Cancelled = 'CANCELLED'
}
interface Order {
id: string;
status: OrderStatus;
method: HttpMethod;
}
const order: Order = {
id: '123',
status: OrderStatus.Processing,
method: HttpMethod.POST
};
// Функция с проверкой
function updateOrder(order: Order, newStatus: OrderStatus): void {
if (newStatus === OrderStatus.Delivered) {
console.log('Заказ доставлен');
}
}
Const Enum
Для оптимизации можно использовать const enum — они полностью стираются при компиляции:
const enum Level {
Debug = 0,
Info = 1,
Warning = 2,
Error = 3
}
const level: Level = Level.Error;
// В скомпилированном JavaScript:
// const level = 3;
Enum vs Union Types
Для строк часто используют union types как альтернативу:
// Enum
enum Status {
Active = 'ACTIVE',
Inactive = 'INACTIVE'
}
// Union type (более современный подход)
type Status = 'ACTIVE' | 'INACTIVE';
const status: Status = 'ACTIVE'; // Работает
Преимущества union types:
- Меньше кода
- Легче в JSON сериализации
- Лучше поддерживаются инструментами
Преимущества enum:
- Обратное преобразование для чисел
- Более явная семантика
- Традиционный подход из других языков
Практические советы
- Предпочитайте string enum — они более читаемы в логах и базах данных
- Используйте const enum для числовых флагов и битовых операций
- Для новых проектов рассмотрите union types как более современную альтернативу
- Документируйте смысл каждого значения enum в комментариях
Заключение
Enum в TypeScript — мощный инструмент для создания типобезопасного кода. Они особенно полезны при работе со статусами, ролями, направлениями и другими фиксированными наборами значений. Правильное использование enum делает код более читаемым, поддерживаемым и защищённым от ошибок.