Как создать «типизированный enum»?

В TypeScript, как и в JavaScript, нет встроенного ключевого слова для создания перечислений, но можно создать «типизированный enum» с использованием простого объекта и типа объединения.

Начнем с создания объекта, который будет представлять наш перечисление. Для каждого элемента перечисления мы будем задавать свойство объекта с уникальным именем и числовым значением, как это делается в обычном перечислении.

const MyEnum = {
  Element1: 0,
  Element2: 1,
  Element3: 2,
};

Далее, чтобы определить типизированный enum для этого объекта, мы можем использовать тип объединения (union type). Для этого создадим новый тип, который будет представлять все возможные значения нашего перечисления.

type MyEnumType = typeof MyEnum[keyof typeof MyEnum];

Теперь мы можем использовать этот тип в качестве аннотации типа для переменных, параметров функций и других мест, где нам нужно работать с элементами перечисления.

function processElement(element: MyEnumType) {
  // ... код обработки элемента перечисления ...
}

const myVariable: MyEnumType = MyEnum.Element1;

Таким образом, мы создали «типизированный enum» в TypeScript с использованием объекта и типа объединения. Этот подход позволяет нам иметь типизацию и автодополнение для элементов перечисления, а также полную гибкость в определении значений элементов и их имен.