Что такое `enum` в TypeScript и когда его использовать?

JuniorTypeScript · Frontend·Обновлено 24 июня 2026
Коротко
enum — это перечисление, позволяющее задать набор именованных констант. Используется когда нужно ограничить переменную фиксированным набором значений, делая код более читаемым и самодокументируемым.

Что такое enum

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

Виды enum

Числовой enum (Numeric enum)

По умолчанию значения начинаются с 0 и автоматически инкрементируются:

enum Direction {
  Up,    // 0
  Down,  // 1
  Left,  // 2
  Right  // 3
}

const move: Direction = Direction.Up;
console.log(move); // 0

Можно задать начальное значение вручную:

enum StatusCode {
  OK = 200,
  NotFound = 404,
  InternalError = 500
}

Строковый enum (String enum)

Каждому члену нужно явно задать строковое значение. Более предсказуем при отладке:

enum Role {
  Admin = 'ADMIN',
  User = 'USER',
  Guest = 'GUEST'
}

function checkAccess(role: Role): boolean {
  return role === Role.Admin;
}

Константный enum (const enum)

При компиляции заменяется инлайн-значениями — не создаёт JavaScript-объект:

const enum Color {
  Red = 'RED',
  Green = 'GREEN',
  Blue = 'BLUE'
}

// После компиляции вместо Color.Red подставится строка 'RED'
const bg: Color = Color.Red;

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

  • Статусы сущностей: OrderStatus.Pending, OrderStatus.Completed
  • Роли пользователей: Role.Admin, Role.User
  • Направления, стороны: Direction.Up, Direction.Down
  • Конечные автоматы с фиксированным числом состояний

Альтернатива: union types и as const

В современном TypeScript часто предпочитают as const вместо enum, так как это не добавляет runtime-кода:

// Вариант с as const
const Role = {
  Admin: 'ADMIN',
  User: 'USER',
} as const;

type Role = typeof Role[keyof typeof Role];
// Role = 'ADMIN' | 'USER'

Важный нюанс: числовые enum и обратное отображение

Числовые enum компилируются в двунаправленный объект:

enum Status {
  Active = 1,
  Inactive = 2
}

console.log(Status[1]); // 'Active' — обратное отображение работает
console.log(Status['Active']); // 1

Это поведение отсутствует у строковых enum, что делает их более предсказуемыми.

Что хочет услышать интервьюер

Кандидат знает синтаксис enum и разницу между числовым и строковым вариантами

Понимает, что enum компилируется в реальный JavaScript-объект (кроме const enum)

Может объяснить, зачем нужен enum — типобезопасность и читаемость кода

Знает об альтернативах: union types, as const объекты

Упоминает особенность числового enum — обратное отображение (reverse mapping)

Пример: Числовой и строковый enum

// Числовой enum — значения автоматически 0, 1, 2...
enum Direction {
  Up,
  Down,
  Left,
  Right
}

// Строковый enum — явные строковые значения
enum Role {
  Admin = 'ADMIN',
  User = 'USER',
  Guest = 'GUEST'
}

// Использование в функции
function redirectUser(role: Role): string {
  if (role === Role.Admin) {
    return '/admin/dashboard';
  }
  return '/home';
}

redirectUser(Role.Admin); // '/admin/dashboard'
redirectUser(Role.User);  // '/home'

Пример: Альтернатива через as const

// Альтернатива enum через as const
const OrderStatus = {
  Pending: 'PENDING',
  Processing: 'PROCESSING',
  Completed: 'COMPLETED',
  Cancelled: 'CANCELLED',
} as const;

// Выводим тип из объекта
type OrderStatus = typeof OrderStatus[keyof typeof OrderStatus];
// OrderStatus = 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'CANCELLED'

function processOrder(status: OrderStatus): void {
  if (status === OrderStatus.Completed) {
    console.log('Заказ выполнен');
  }
}

// Нет лишнего JS-кода в бандле, тип такой же строгий

Типичные ошибки

Использование числового enum там, где строковый был бы безопаснее и нагляднее при отладке

Незнание того, что числовой enum создаёт обратное отображение (можно обратиться по значению)

Смешение enum с type alias или interface — непонимание, что enum это runtime-конструкция

Игнорирование const enum как способа оптимизировать бандл при использовании в hot-path коде

Не знают об альтернативе через as const и не могут объяснить компромиссы между подходами

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Feature-Sliced Design

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.5
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее