Проверка наличия значения в enum в TypeScript: без массивов
Быстрый ответ
Чтобы установить, встречается ли значение в TypeScript-перечислении (enum), можно удобно применить оператор in
для ключей и метод Object.values()
для проверки самих значений. Вот пример:
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
— проверяет присутствие значения.
Проверка типов перечислений и их значений
Перечисления в TypeScript могут быть разных типов и при их проверке необходимы разные подходы. Рассмотрим два основных варианта — строковые и числовые перечисления.
Проверка значений в строковых перечислениях
При работе со строковыми перечислениями хорошим решением будет использование метода Object.values()
:
enum StringEnum {
First = "Uno",
Second = "Dos"
}
const valueExists = Object.values(StringEnum).includes("Dos"); // true, здесь "Dos" присутствует в перечислении
Если версия ECMAScript не поддерживает этот метод, вам будет нужно обновить tsconfig.json
:
{
"compilerOptions": {
"target": "ES2017"
}
}
В ряде случаев TypeScript может оповестить о несоответствии типов. Тогда следует использовать явное приведение типов:
const enumValues = Object.values(StringEnum) as string[];
Проверка значений в числовых перечислениях
Чуть сложнее обстоит дело с числовыми перечислениями:
enum NumberEnum {
One = 1,
Two
}
const doesTwoExist = 2 in NumberEnum; // false, "2" отсутствует
Для проверки наличия значения более предпочтительной является скобочная нотация:
const doesOneExist = NumberEnum[NumberEnum.One] !== undefined; // true, NumberEnum.One присутствует
Бонусные методы проверки
Если стандартные методы недостаточно эффективны, вы можете применять более продвинутые приёмы.
Обработка перечислений с разнотипными значениями
Перечисления со смешанными типами требуют приведения типов:
const enumValue = Object.values(StringEnum)
.find(value => value === "Dos") as StringEnum; // Теперь все в полном порядке!
Итерация по перечислению для глубокой проверки
В некоторых случаях полезно воспользоваться итерацией:
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 не предоставляет обратного отображения для строковых перечислений, в отличие от числовых.
Визуализация
Можно представить проверку значения перечисления как поиск подходящего ключа к сокровищам:
Перечисление (🗝️): { Ключ1, Ключ2, Ключ3 }
Значение (💎): 'Ключ2'
Попробуйте этот ключ — сравните Значение
с каждым элементом перечисления!
if (Object.values(Enum).includes(Value)) {
console.log('🔓'); // Сокровища открыты!
} else {
console.log('🔒'); // Путь закрыт, стоит продолжить поиски.
}
Проверка наличия ключа в TypeScript легко реализуется благодаря сочетанию Object.values()
и .includes()
.
Сложности работы с перечислениями: особые случаи
Перечисления иногда могут ввести вас в заблуждение. Вот несколько советов для решения запутанных задач:
Работа с смешанными перечислениями
Смешанные перечисления требуют тщательной проверки:
enum MixedEnum {
First = 1,
Second = "Two"
}
// Если у вас возникают сомнения, лучше проверить и ключ, и значение
const doesExist = ('First' in MixedEnum && MixedEnum['First'] === 1); // Это надёжный способ проверки
Сужение типов для перечислений
Пользовательские стражи типа могут пригодиться при испльзовании перечислений:
function isEnumValue(value): value is StringEnum {
return Object.values(StringEnum).includes(value); // Здесь на службе страж типа!
}
Полезные материалы
- TypeScript: Руководство – Перечисления — подробное руководство по работе с перечислениями.
- Обсуждение на Stack Overflow о проверке перечислений в TypeScript — отличная и полезная дискуссия.
- TypeScript: Документация – Продвинутые типы — все об охранниках типов в документации TypeScript.
- Перечисления в TypeScript — глубокое изучение перечислений от Басарата Али Саеда.
- Обсуждения и вопросы, связанные с перечислениями в GitHub TypeScript — для тех, кто ищет более глубокое понимание.
- Как получить имена элементов перечисления — прекрасная помощь в поиске ключей перечисления.