В TypeScript есть enum (сокращение от enumeration: перечисление) - это специальный тип, который позволяет создавать именованные наборы значений.
Если значение не задано, элементы будут автоматически пронумерованы числами, начиная с 0.
enum Status {
Loading,
Success,
Error
}
let currentStatus: Status = Status.Success;
console.log(currentStatus); // 1, потому что Loading = 0, Success = 1 и т.д.При этом можно задать значения явно.
enum Status {
Loading = 'loading',
Success = 'success',
Error = 'error',
}
let currentStatus: Status = Status.Success;
console.log(currentStatus); // 'success'Enum позволяет сделать код более читаемым.
Мы избегаем «магических» строк и чисел и сразу видим, какую бизнес-ценность несёт проверка. Код при этом становится самодокументируемым.
🟣Чем enum лучше обычных объектов?
Проблема объектов в том, что мы не можем напрямую использовать объект как тип для типизации перечисления значений.
Даже используя оператор typeof мы получим тип всего объекта, а не конкретное перечисление возможных значений (скрин 1).
Enumы решает эту проблему и добавляют удобный автокомплит (скрин 2).
Но важно понимать, что enumы не пропадают бесследно.
Они компилируется в объект, который содержит все значения (скрин 3).
Именно поэтому обычные числовые enumы имеют двустороннюю связь: по значению можно получить ключ.
enum Direction {
Up, // 0
}
console.log(Direction[0]); // Output: "Up"🟣С точки зрения оптимизации памяти - такой подход уступает обычным литералам.
Поэтому в TypeScript существуют const enum.
Вместо создания полноценного объекта при компиляции, значения подставляются напрямую как литералы, что значительно экономит память (скрин 4).
🟣Однако const enum накладывает некоторые ограничения:
- Мы теперь не можем итерироваться по enumу, так как объекта физически нет (скрин 5).
- Мы не можем использовать обратное отображение для числовых enumов, чтобы получить ключ по значению (скрин 6).
🟣Так же в современном TypeScript мы можем использовать объекты с as const как альтернативу enum.
Эта конструкция создаёт readonly объект, где все значения используются как литералы.
const Status = {
Loading: 'loading',
Success: 'success',
Error: 'error',
} as const;Вы можете спросить: как в таком случае типизировать входные данные, если обычный объект не позволял этого сделать?
Благодаря константному объекту - теперь мы сможем затипизировать значения объекта с помощью двух операторов:
- оператор typeof — позволяет получить тип на основе объекта.
- оператор keyof — позволяет получить ключи типа.
Написав соответствующую строчку, мы можем создать тип TStatus, который будет включать только конкретные значения объекта (скрин 7).
✈️ Telegram | 🎓 Менторство | 📹 YouTube | 👩💻 Roadmap






