Числовые и строковые перечисления и их компиляция в JavaSc... | Вопросы для собеседования | Skilio
Числовые и строковые перечисления и их компиляция в JavaScript
Вопрос:

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

Понимание потенциальных подводных камней при использовании перечислений имеет решающее значение. Смешение типов или зависимость от автоматически инкрементируемых значений может привести к нежелательному поведению. Например, добавление нового члена в середину числового перечисления может сдвинуть все последующие значения, потенциально вызвав ошибки. Всякий раз, когда это возможно, указывайте значения явно, чтобы избежать этих проблем.

0
TypeScript Новичок Опубликовано
© Skilio, 2025
Условия использования
Политика конфиденциальности
Мы используем файлы cookie, для персонализации сервисов и повышения удобства пользования сайтом. Если вы не согласны на их использование, поменяйте настройки браузера.