Назад | Учебник TypeScript | Вперёд
Перечисления в TypeScript объявляются с помощью enum:
1 2 3 4 5 6 7 |
enum GameState { MAIN_MENU, INTRO, GAME, WIN, LOOSE } |
В примере выше элементы перечисления инициализируются значениями: MAIN_MENU=0, INTRO=1,GAME=2 и т. д. Мы можем изменить нумерацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enum GameState { MAIN_MENU = 3, INTRO, GAME = 8, WIN, LOOSE } alert("MAIN_MENU = " + GameState.MAIN_MENU); // 3 alert("INTRO = " + GameState.INTRO); // 4 alert("GAME = " + GameState.GAME); // 8 alert("WIN = " + GameState.WIN); // 9 alert("LOOSE = " + GameState.LOOSE); // 10 |
Как видим, значения у всех элементов перечислений идут увеличиваются на единицу относительно предыдущего, если значение не указано явно.
Можно элементам перечисления давать строковые значения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enum GameState { MAIN_MENU = "ITEM0", INTRO = "INTRO", GAME = "just a game", WIN = "WIN", LOOSE = "LOOSE" } alert("MAIN_MENU = " + GameState.MAIN_MENU); // ITEM0 alert("INTRO = " + GameState.INTRO); // INTRO alert("GAME = " + GameState.GAME); // just a game alert("WIN = " + GameState.WIN); // WIN alert("LOOSE = " + GameState.LOOSE); // LOOSE |
При желании можно даже чередовать строковые и числовые значения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enum GameState { MAIN_MENU = "ITEM0", INTRO = 1, GAME = 2, WIN = 3, LOOSE = "LOOSE" } alert("MAIN_MENU = " + GameState.MAIN_MENU); // ITEM0 alert("INTRO = " + GameState.INTRO); // 1 alert("GAME = " + GameState.GAME); // 2 alert("WIN = " + GameState.WIN); // 3 alert("LOOSE = " + GameState.LOOSE); // LOOSE |
Каждый элемент перечисления в TypeScript имеет своё значение, которое может быть константным или вычисляемым. Элемент считается константным, если:
- Это первый элемент в перечислении и у него нет инициализатора. В этом случае он считается константным и его значение будет равно 0. Пример:
1 |
GameState { NORMAL }; |
- У него нет инициализатора и предыдущий элемент в перечислении был числовой константой. В этом случае значением этого элемента будет значение предыдущего элемента, увеличенное на единицу.
1 2 3 4 5 6 7 8 9 10 11 |
// NORMAL, WIN, LOOSE будут константами enum GameState { NORMAL, WIN, LOOSE } // DEAD, ALIVE, GHOST будут константами enum MonsterState { DEAD = 3, ALIVE, GHOST } |
- Элемент перечисления инициализирован константным выражением, то есть выражением TypeScript, которое может быть полностью вычислено на этапе компиляции (в кратце можно сказать так: константное выражение состоит из базовых строковых и числовых литералов и операций над ними).
Во всех остальных случаях элемент перечисления считается вычисляемым.
Элементы перечисления без выражений инициализации должны идти либо первыми в списке элементов перечисления, либо они должны располагаться после элементов перечисления, инициализированных константой или других константных элементов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enum MonsterType { GOBLIN, GHOUL = 4, GOOSE, MOUSE, VAMPIRE = getSomeValue(), // VALKIRIYA, Нельзя. Предыдущий элемент не константный VALKIRIYA = 3 // Можно } function getSomeValue(): number { return 100; } |
Можно получить наименование элемента перечисления из переменной, ссылающейся на элемент перечисления:
1 2 3 4 5 6 7 8 9 10 11 12 |
enum GameState { NORMAL, WIN, LOOSE } let g = GameState.WIN; let enumName = GameState[g]; // "WIN" alert(enumName); |
Существует const enum:
1 2 3 4 |
const enum MonsterType { GOBLIN = 3, GHOUL = 5 } |
В отличие от обычных перечислений const enum может использовать только константные элементы и полностью удаляется из runtime-кода. Во все места его использования подставляются реальные значения.
Если мы используем сторонние библиотеки, то иногда необходимо объявлять ambient enum-ы. В этом случае компилятор не будет генерировать код перечисления:
1 2 3 4 5 |
declare enum GameState { NORMAL = 1, WIN, LOOSE = 2 } |
Назад | Учебник TypeScript | Вперёд