Что такое `enum` в TypeScript и когда его использовать?
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 и не могут объяснить компромиссы между подходами


