February 25, 2024
Как получить ключи из 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' }]