February 25
Как получить ключи из Enum в Typescript?
В мире TypeScript
существует множество полезных утилитарных функций, которые могут упростить повседневные задачи программирования. Одной из таких функций, которая заслуживает внимания, является convertEnumToObjectCollection
. Эту функцию я написал для одного из своих проектов, чтобы облегчить работу с селектами.
/** * Converts an enum into an array of objects with `id` and `key` properties. * * @param {T} arg - The enum object. * @returns {Array<{ id: number, key: T }>} - An array of objects with `id` and `key` properties. * @template T */ export function convertEnumToObjectCollection<T>(arg: T): EnumKeyValue<T>[] { const _arr = []; for (const n in arg) { if(typeof arg[n] === 'number') { _arr.push({id: arg[n], key: n}); } } return [..._arr] as EnumKeyValue<T>[]; } export interface EnumKeyValue<T> { id: number; key: T; }
Разберемся с логикой
В основе convertEnumToObjectCollection
лежит конвертация TypeScript перечислений (enums) в коллекции объектов, что облегчает работу с ними в различных сценариях. Давайте разберем ее функционал по шагам:
- Обобщенный подход: Функция объявлена с обобщенным типом
T
, что позволяет ей принимать любой тип перечисления. - Итерация по перечислению: С помощью цикла
for...in
функция перебирает свойства входного перечисления (arg
). Она проверяет каждое свойство, чтобы определить, является ли его значение числом, чтобы в итоговую коллекцию попали только числовые значения перечисления. - Создание коллекции объектов: Для каждого числового значения перечисления функция создает объект с двумя свойствами:
id
(значение перечисления) иkey
(ключ перечисления). Эти объекты добавляются в массив (_arr
). - Утверждение типа: Наконец, функция возвращает копию массива
_arr
, обеспечивая правильное выведение типа для результирующего массива какEnumKeyValue<T>[]
.
Зачем нужно?
Теперь, когда мы поняли, как работает convertEnumToObjectCollection
, давайте рассмотрим, почему это такая ценная утилита для разработчиков TypeScript:
- Повышает безопасность типов: Используя систему типов TypeScript,
convertEnumToObjectCollection
поддерживает безопасность типов на протяжении всего процесса конвертации. Это гарантирует, что результирующая коллекция объектов сохраняет информацию о типе исходного перечисления, предотвращая потенциальные ошибки типов в будущем. - Универсальное применение: Результирующую коллекцию объектов можно использовать в различных сценариях, таких как генерация вариантов для выпадающего списка, сопоставление значений перечисления с элементами пользовательского интерфейса или выполнение поиска на основе ключей перечисления.
Пример использования:
enum Color { Red = 1, Green = 2, Blue = 3 } const colorCollection = convertEnumToObjectCollection(Color); console.log(colorCollection); // Вывод: [{ id: 1, key: 'Red' }, { id: 2, key: 'Green' }, { id: 3, key: 'Blue' }]