Комментарии (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"; // Проще, но рассеяно
Сравнение:
| Характеристика | Enum | Union |
|---|---|---|
| Группировка | Явная | Неявная |
| Автодополнение | Отлично | Хорошо |
| Рефакторинг | Легко | Сложнее |
| Размер кода | Больше | Меньше |
| 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 для создания надежного и поддерживаемого кода.