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

Что такое enum?

1.0 Junior🔥 71 комментариев
#TypeScript

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

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

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

Что такое enum

Enum (Enumeration - перечисление) - это тип данных, который представляет набор именованных констант. Enum ограничивает значение переменной только определённым набором возможных значений.

Концепция Enum

// Enum - это набор именованных констант
enum Status {
  PENDING = "pending",
  APPROVED = "approved",
  REJECTED = "rejected"
}

// Использование
const userStatus: Status = Status.PENDING;
console.log(userStatus); // "pending"

Зачем нужны enum

Проблема без enum:

// BAD - магические строки везде
function updateUser(status) {
  if (status === "pending") {
    // делай что-то
  } else if (status === "approved") {
    // делай что-то ещё
  }
}

updateUser("pending");
updateUser("aproved"); // Опечатка! Никто не поймёт
updateUser("PENDING"); // Другой формат - ошибка

Решение с enum:

enum Status {
  PENDING = "pending",
  APPROVED = "approved",
  REJECTED = "rejected"
}

function updateUser(status: Status) {
  if (status === Status.PENDING) {
    // делай что-то
  }
}

updateUser(Status.PENDING); // OK
updateUser(Status.APROVED);  // Ошибка TypeScript - не существует такого значения
updateUser("pending");       // Ошибка TypeScript - нужно Status.PENDING

Виды enum в TypeScript

1. String enum (строковое перечисление)

enum Color {
  RED = "red",
  GREEN = "green",
  BLUE = "blue"
}

const myColor: Color = Color.RED;
console.log(myColor); // "red"

2. Numeric enum (числовое перечисление)

enum Direction {
  UP = 1,
  DOWN = 2,
  LEFT = 3,
  RIGHT = 4
}

const dir: Direction = Direction.UP;
console.log(dir); // 1

// Можно автоматически
enum Status {
  PENDING,   // 0
  APPROVED,  // 1
  REJECTED   // 2
}

3. Heterogeneous enum (смешанное)

enum Response {
  NO = 0,
  YES = "YES",
  MAYBE = 2
}

4. Const enum (константное перечисление)

const enum Level {
  ERROR = "error",
  WARNING = "warning",
  INFO = "info"
}

// const enum удаляется при компиляции - нет runtime overhead
const level: Level = Level.ERROR;
// Компилируется в: const level = "error";

Практические примеры

Пример 1: Статусы заказа

enum OrderStatus {
  PENDING = "pending",
  PROCESSING = "processing",
  SHIPPED = "shipped",
  DELIVERED = "delivered",
  CANCELLED = "cancelled"
}

interface Order {
  id: string;
  status: OrderStatus;
  createdAt: Date;
}

function canCancelOrder(status: OrderStatus): boolean {
  return status === OrderStatus.PENDING || status === OrderStatus.PROCESSING;
}

const order: Order = {
  id: "123",
  status: OrderStatus.PENDING,
  createdAt: new Date()
};

if (canCancelOrder(order.status)) {
  console.log("Заказ можно отменить");
}

Пример 2: Роли пользователей

enum UserRole {
  ADMIN = "admin",
  MODERATOR = "moderator",
  USER = "user",
  GUEST = "guest"
}

interface User {
  id: string;
  name: string;
  role: UserRole;
}

function hasPermission(user: User, action: string): boolean {
  const permissions: Record<UserRole, string[]> = {
    [UserRole.ADMIN]: ["read", "write", "delete", "ban"],
    [UserRole.MODERATOR]: ["read", "write", "delete"],
    [UserRole.USER]: ["read", "write"],
    [UserRole.GUEST]: ["read"]
  };
  
  return permissions[user.role].includes(action);
}

const user: User = { id: "1", name: "John", role: UserRole.ADMIN };
hasPermission(user, "delete"); // true
hasPermission(user, "ban");     // true

Enum vs Union Types

Enum:

enum Status {
  PENDING = "pending",
  APPROVED = "approved"
}

const status: Status = Status.PENDING;

Union Type (альтернатива):

type Status = "pending" | "approved";

const status: Status = "pending"; // Проще, но рассеяно

Сравнение:

ХарактеристикаEnumUnion
ГруппировкаЯвнаяНеявная
АвтодополнениеОтличноХорошо
РефакторингЛегкоСложнее
Размер кодаБольшеМеньше
RuntimeЕсть overheadУдаляется

Enum с методами

enum Status {
  PENDING = "pending",
  APPROVED = "approved",
  REJECTED = "rejected"
}

// Добавляем вспомогательный объект
const StatusInfo = {
  [Status.PENDING]: { label: "На рассмотрении", color: "yellow" },
  [Status.APPROVED]: { label: "Одобрено", color: "green" },
  [Status.REJECTED]: { label: "Отклонено", color: "red" }
};

function getStatusLabel(status: Status): string {
  return StatusInfo[status].label;
}

function getStatusColor(status: Status): string {
  return StatusInfo[status].color;
}

getStatusLabel(Status.PENDING); // "На рассмотрении"

Обратное отображение (Reverse Mapping)

enum Direction {
  UP = 1,
  DOWN = 2
}

// Numeric enum имеет обратное отображение
console.log(Direction[1]);       // "UP"
console.log(Direction["UP"]);    // 1

// String enum не имеет обратного отображения
enum Status {
  PENDING = "pending",
  APPROVED = "approved"
}

console.log(Status["PENDING"]); // undefined
console.log(Status["pending"]); // undefined

Лучшие практики

1. Используй UPPER_SNAKE_CASE для названия членов enum

// GOOD
enum UserRole {
  ADMIN = "admin",
  MODERATOR = "moderator"
}

// BAD
enum UserRole {
  admin = "admin",
  moderator = "moderator"
}

2. Используй const enum для production кода

// const enum удаляется при компиляции
const enum Level {
  ERROR = "error",
  WARNING = "warning"
}

// Компилируется в: const level = "error";
const level = Level.ERROR;

3. Цельтесь на string enum вместо numeric

// GOOD - понятные значения
enum Status {
  PENDING = "pending",
  APPROVED = "approved"
}

// BAD - магические числа
enum Status {
  PENDING = 0,
  APPROVED = 1
}

Когда использовать Enum

Используй enum когда:

  • Значения ограничены предопределённым набором
  • Нужна type-safety
  • Часто используется одно и то же значение
  • Нужна группировка связанных констант

Используй Union Type когда:

  • Значения простые и очень немного
  • Нужна минимальная сложность
  • Enum кажется избыточным
// Enum имеет смысл
enum HttpMethod {
  GET = "GET",
  POST = "POST",
  PUT = "PUT",
  DELETE = "DELETE"
}

// Union достаточно
type Visibility = "public" | "private";

Вывод

Enum - это способ создавать type-safe наборы констант, которые:

  • Предотвращают опечатки (type-checking)
  • Улучшают автодополнение IDE
  • Делают код понятнее
  • Облегчают рефакторинг

Enum особенно полезен в TypeScript для создания надежного и поддерживаемого кода.

Что такое enum? | PrepBro