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

Что такое перечисления enum в TypeScript?

1.3 Junior🔥 201 комментариев
#TypeScript

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

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

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

Перечисления (Enum) в TypeScript

Enum (enumeration) — это специальный тип в TypeScript, который позволяет определить набор именованных констант. Перечисления используются для создания читаемого кода и предотвращения ошибок при работе с фиксированным набором значений.

Основное назначение

Enum решают следующие задачи:

  1. Повышение читаемости кода — вместо магических чисел или строк используются имена
  2. Типизация — ограничение возможных значений переменной
  3. Автодополнение в IDE — лучшая поддержка редактора
  4. Предотвращение ошибок — невозможно передать недопустимое значение

Числовые перечисления

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:

  • Обратное преобразование для чисел
  • Более явная семантика
  • Традиционный подход из других языков

Практические советы

  1. Предпочитайте string enum — они более читаемы в логах и базах данных
  2. Используйте const enum для числовых флагов и битовых операций
  3. Для новых проектов рассмотрите union types как более современную альтернативу
  4. Документируйте смысл каждого значения enum в комментариях

Заключение

Enum в TypeScript — мощный инструмент для создания типобезопасного кода. Они особенно полезны при работе со статусами, ролями, направлениями и другими фиксированными наборами значений. Правильное использование enum делает код более читаемым, поддерживаемым и защищённым от ошибок.