Enums и as const
Enum (перечисления) в TypeScript — это способ определения набора именованных констант. Enums полезны, когда нужно работать с набором связанных значений, которые имеют смысл только в контексте друг друга.
Пример Enum
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
let move: Direction = Direction.Up;
console.log(move); // "UP"
Особенности Enum
1. Числовые Enums:
Если значения не указаны явно, TypeScript автоматически присваивает числа, начиная с 0.
enum Status {
Pending, // 0
Approved, // 1
Rejected, // 2
}
2. Строковые Enums:
Каждое значение должно быть явно указано.
enum Direction {
Up = "UP",
Down = "DOWN",
}
3. Гетерогенные Enums:
Можно смешивать строковые и числовые значения (но это не рекомендуется).
enum Mixed {
Yes = 1,
No = "NO",
}
Проблемы с Enum
- Генерируют дополнительный код: Enums компилируются в JavaScript-объекты, что может увеличить размер кода.
- Не всегда интуитивно понятны: Например, числовые Enums могут быть неочевидными.
- Сложности с деревомизацией (tree-shaking): Enums могут мешать оптимизации кода при сборке.
Замена Enum с помощью as const
В TypeScript можно использовать объекты с as const, чтобы создать тип, аналогичный Enum, но без его недостатков.
const Direction = {
Up: "UP",
Down: "DOWN",
Left: "LEFT",
Right: "RIGHT",
} as const;
type Direction = typeof Direction[keyof typeof Direction];
let move: Direction = Direction.Up;
console.log(move); // "UP"
Преимущества as const:
- Без дополнительного кода:
as constне генерирует дополнительный код в JavaScript. - Иммутабельность: Значения становятся read-only.
- Деревоизация: Легче оптимизировать при сборке.
- Гибкость: Можно использовать строки, числа и другие типы.
Пример с числовыми значениями:
const Status = {
Pending: 0,
Approved: 1,
Rejected: 2,
} as const;
type Status = typeof Status[keyof typeof Status];
let currentStatus: Status = Status.Approved;
console.log(currentStatus); // 1
Итог
- Enum — это классический способ определения набора констант, но он имеет недостатки.
as const— это современная альтернатива, которая более гибкая и эффективная.
Используйте as const, если хотите избежать недостатков Enum и сделать код более легковесным и оптимизированным.
🚀 Источник: DeepSeek