Проверка наличия значения в enum в TypeScript: без массивов

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы установить, встречается ли значение в TypeScript-перечислении (enum), можно удобно применить оператор in для ключей и метод Object.values() для проверки самих значений. Вот пример:

typescript
Скопировать код
enum MyEnum {
  A = 'Alpha',
  B = 'Bravo'
}

const inputValue = 'Alpha';

// Проверяем наличие ключа в перечислении
const isKeyExists = 'A' in MyEnum; // true

// Проверяем наличие значения в перечислении
const isValueExists = Object.values(MyEnum).includes(inputValue); // true

Таким образом, isKeyExists определяет наличие ключа в перечислении, а isValueExists — проверяет присутствие значения.

Кинга Идем в IT: пошаговый план для смены профессии

Проверка типов перечислений и их значений

Перечисления в TypeScript могут быть разных типов и при их проверке необходимы разные подходы. Рассмотрим два основных варианта — строковые и числовые перечисления.

Проверка значений в строковых перечислениях

При работе со строковыми перечислениями хорошим решением будет использование метода Object.values():

typescript
Скопировать код
enum StringEnum {
  First = "Uno",
  Second = "Dos"
}

const valueExists = Object.values(StringEnum).includes("Dos"); // true, здесь "Dos" присутствует в перечислении

Если версия ECMAScript не поддерживает этот метод, вам будет нужно обновить tsconfig.json:

json
Скопировать код
{
  "compilerOptions": {
    "target": "ES2017"
  }
}

В ряде случаев TypeScript может оповестить о несоответствии типов. Тогда следует использовать явное приведение типов:

typescript
Скопировать код
const enumValues = Object.values(StringEnum) as string[];

Проверка значений в числовых перечислениях

Чуть сложнее обстоит дело с числовыми перечислениями:

typescript
Скопировать код
enum NumberEnum {
  One = 1,
  Two
}

const doesTwoExist = 2 in NumberEnum; // false, "2" отсутствует

Для проверки наличия значения более предпочтительной является скобочная нотация:

typescript
Скопировать код
const doesOneExist = NumberEnum[NumberEnum.One] !== undefined; // true, NumberEnum.One присутствует

Бонусные методы проверки

Если стандартные методы недостаточно эффективны, вы можете применять более продвинутые приёмы.

Обработка перечислений с разнотипными значениями

Перечисления со смешанными типами требуют приведения типов:

typescript
Скопировать код
const enumValue = Object.values(StringEnum)
  .find(value => value === "Dos") as StringEnum; // Теперь все в полном порядке!

Итерация по перечислению для глубокой проверки

В некоторых случаях полезно воспользоваться итерацией:

typescript
Скопировать код
for (const [key, value] of Object.entries(NumberEnum)) {
  if (value === yourValue) {
    // Соответствие найдено.
  }
}

// Или же использовать метод some() массива
const doesExist = Object.values(StringEnum).some(val => val === "Dos");  // "Dos" есть в перечислении!

Особенности перечислений в TypeScript

Некоторые особенности поведения перечислений в TypeScript могут оказаться не совсем очевидными:

  • Использование const enums затрудняет проверку, поскольку они интегрируются на этапе компиляции.
  • При транспиляции TypeScript может потребоваться ручная итерация для проверки типов в рантайме.
  • TypeScript не предоставляет обратного отображения для строковых перечислений, в отличие от числовых.

Визуализация

Можно представить проверку значения перечисления как поиск подходящего ключа к сокровищам:

Markdown
Скопировать код
Перечисление (🗝️): { Ключ1, Ключ2, Ключ3 }
Значение (💎): 'Ключ2'

Попробуйте этот ключ — сравните Значение с каждым элементом перечисления!

typescript
Скопировать код
if (Object.values(Enum).includes(Value)) {
  console.log('🔓');  // Сокровища открыты!
} else {
  console.log('🔒');  // Путь закрыт, стоит продолжить поиски.
}

Проверка наличия ключа в TypeScript легко реализуется благодаря сочетанию Object.values() и .includes().

Сложности работы с перечислениями: особые случаи

Перечисления иногда могут ввести вас в заблуждение. Вот несколько советов для решения запутанных задач:

Работа с смешанными перечислениями

Смешанные перечисления требуют тщательной проверки:

typescript
Скопировать код
enum MixedEnum {
  First = 1,
  Second = "Two"
}

// Если у вас возникают сомнения, лучше проверить и ключ, и значение
const doesExist = ('First' in MixedEnum && MixedEnum['First'] === 1);  // Это надёжный способ проверки

Сужение типов для перечислений

Пользовательские стражи типа могут пригодиться при испльзовании перечислений:

typescript
Скопировать код
function isEnumValue(value): value is StringEnum {
  return Object.values(StringEnum).includes(value); // Здесь на службе страж типа!
}

Полезные материалы

  1. TypeScript: Руководство – Перечисления — подробное руководство по работе с перечислениями.
  2. Обсуждение на Stack Overflow о проверке перечислений в TypeScript — отличная и полезная дискуссия.
  3. TypeScript: Документация – Продвинутые типы — все об охранниках типов в документации TypeScript.
  4. Перечисления в TypeScript — глубокое изучение перечислений от Басарата Али Саеда.
  5. Обсуждения и вопросы, связанные с перечислениями в GitHub TypeScript — для тех, кто ищет более глубокое понимание.
  6. Как получить имена элементов перечисления — прекрасная помощь в поиске ключей перечисления.
Свежие материалы