6. Typescript
6.2. Enums

6.2.Enums

6.2.1. Примеры нейминга

// ✅ Numeric enums
enum Direction {
  Up = 1,
  Down = 2,
  Left = 3,
  Right = 4,
}
 
// ✅ String enums
enum Direction {
  Up = 'UP',
  Down = 'DOWN',
  Left = 'LEFT',
  Right = 'RIGHT',
}

6.2.2. Не используйте const enum

const enum Direction {
  Up = 1,
  Down = 2,
  Left = 3,
  Right = 4,
}
  • В TypeScript перечисления (enum) уже нельзя изменять, они предоставляют фиксированный набор значений.
  • const enum - это особенность языка, связанная с оптимизацией, которая делает перечисление невидимым для пользователей JavaScript модуля.
  • По сути, const enum создает эффективное определение значений на уровне компиляции, и эти значения заменяются непосредственно в коде TypeScript на их числовые эквиваленты. Однако, это также означает, что "const enum" не будет доступен в JavaScript после компиляции, что может привести к проблемам, если вы хотите использовать эти значения в других модулях JavaScript.
  • Поэтому рекомендуется использовать обычное перечисление (enum), которое останется видимым и после компиляции в JavaScript. Это обеспечит совместимость с другими модулями JavaScript и упростит отладку и поддержку вашего кода.

6.2.3. Objects vs Enums

1 пример. String enums используем в качестве типа

enum DirectionStr {
  Up = 'UP',
  Down = 'DOWN',
  Left = 'LEFT',
  Right = 'RIGHT',
}
 
function foo(a: DirectionStr) {
  // code
}
 
foo(DirectionStr.Up) // ✅ Так все хорошо отработает
foo('UP') // ❌ А вот так нет 🤔

2 пример. Number enums используем в качестве типа

enum Direction {
  Up = 1,
  Down = 2,
  Left = 3,
  Right = 4,
}
 
function foo(a: Direction) {
  // code
}
 
foo(Direction.Up) // ✅ Так все хорошо отработает
foo(1) // ✅ И так все хорошо отработает
foo(10) // ❌ А вот так будет ошибка 👍

3 пример. Используем as const (String enums)

const direction = {
  Up: 'UP',
  Down: 'DOWN',
  Left: 'LEFT',
  Right: 'RIGHT',
} as const
 
// Типизация
type Direction = (typeof direction)[keyof typeof direction]
 
function foo(a: Direction) {
  // code
}
 
foo(direction.Up) // ✅ Так все хорошо отработает
foo('UP') // ✅ И так все хорошо отработает 👍
foo('UP2') // ❌ А вот так будет ошибка 👍

4 пример. Используем as const (Number enums)

const direction = {
  Up: 1,
  Down: 2,
  Left: 3,
  Right: 4,
} as const
 
type Direction = (typeof direction)[keyof typeof direction]
 
function foo(a: Direction) {
  // code
}
 
foo(direction.Up) // ✅ Так все хорошо отработает
foo(1) // ✅ И так все хорошо отработает 👍
foo(10) // ❌ А вот так будет ошибка 👍

Выводы:

  • Enum - одна из немногих возможностей TypeScript, которая не является расширением JavaScript на уровне типов.
  • Enum - не очевидно работает в качестве типов