Что такое перечисление (enum) в TypeScript и как определить числовое перечисление?
Подсказки:
- Подумайте, как перечисления могут помочь управлять именованными константами в вашем коде.
- В чем разница между числовыми и строковыми перечислениями в TypeScript.
Превосходя ожидания:
- Как перечисления TypeScript компилируются в JavaScript и последствия для производительности во время выполнения и безопасности типов.
- Использование
const enum
для оптимизации производительности. - Понимание потенциальных подводных камней использования перечислений с смешанными типами или автоматически инкрементируемыми значениями.
- Обратные отображениях в числовых перечислениях и о том, когда они могут быть полезны.
Перечисления (enum) в TypeScript — это способ определения набора именованных констант, что может сделать код более читаемым и поддерживаемым. Перечисления позволяют определять набор связанных значений, которые можно использовать безопасным для типов способом. Они бывают двух основных типов: числовые перечисления и строковые перечисления.
Для определения числового перечисления в TypeScript используйте ключевое слово enum
, за которым следует набор именованных констант. По умолчанию числовые перечисления автоматически инкрементируются, начиная с 0. Вот пример:
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right // 3
}
В этом примере Direction.Up
присваивается значение 0, Direction.Down
— 1 и так далее. Вы также можете явно задать значение одного или нескольких членов:
enum Status {
Active = 1,
Inactive,
Pending
}
Здесь Status.Active
устанавливается в 1, а Status.Inactive
и Status.Pending
автоматически инкрементируются оттуда, становясь соответственно 2 и 3.
Обратное отображение (Reverse Mapping) — это функция числовых перечислений, которая позволяет получить имя члена перечисления по его числовому значению. Например:
let statusName: string = Status[1]; // "Active"
Строковые перечисления — это другой вид перечислений, где каждый член явно присваивается строковому значению. Они не поддерживают автоматическое инкрементирование ни обратное отображение:
enum Color {
Red = "RED",
Green = "GREEN",
Blue = "BLUE"
}
В примере выше каждому цвету явно присваивается строковое значение, что в некоторых случаях обеспечивает лучшую читаемость и безопасность типов.
Перечисления TypeScript компилируются в обычные объекты JavaScript. Числовые перечисления компилируются в объекты с прямым и обратным отображением. Это может иметь последствия для производительности во время выполнения и безопасности типов:
var Direction;
(function (Direction) {
Direction[Direction["Up"] = 0] = "Up";
Direction[Direction["Down"] = 1] = "Down";
Direction[Direction["Left"] = 2] = "Left";
Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));
Для оптимизации производительности используйте const enum
. Это устраняет необходимость в объекте во время выполнения и непосредственно подставляет значения перечисления, уменьшая накладные расходы:
const enum Size {
Small,
Medium,
Large
}
let size: Size = Size.Medium; // Компилируется в var size = 1;
Однако имейте в виду, что const enum
не поддерживает обратное отображение.
Понимание потенциальных подводных камней при использовании перечислений имеет решающее значение. Смешение типов или зависимость от автоматически инкрементируемых значений может привести к нежелательному поведению. Например, добавление нового члена в середину числового перечисления может сдвинуть все последующие значения, потенциально вызвав ошибки. Всякий раз, когда это возможно, указывайте значения явно, чтобы избежать этих проблем.