Skip to main content

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