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 - не очевидно работает в качестве типов