В TypeScript, если вы хотите вернуть ключи объекта в виде enum, используя keyof typeof
, то есть возможность сделать это без использования as
с помощью интроспекции типов.
Для начала, давайте рассмотрим пример объекта, для которого мы хотим получить enum с ключами:
const obj = { key1: 'value1', key2: 'value2', key3: 'value3', };
Хотя TypeScript не предоставляет нативной функциональности для автоматического преобразования keyof typeof obj
в тип enum, мы можем воспользоваться механизмом интроспекции типов, чтобы создать такой тип самостоятельно.
Вот шаги, которые вы можете выполнить для достижения этой цели:
1. Определите интерфейс с именем EnumKeys
:
interface EnumKeys { enumKey: keyof typeof obj; }
Этот интерфейс будет позволять нам преобразовать keyof typeof obj
в тип enum.
2. Создайте переменную типа EnumKeys[]
и запишите в нее все ключи объекта obj:
const enumKeys: EnumKeys[] = Object.keys(obj).map((k) => ({ enumKey: k as keyof typeof obj }));
У нас есть массив enumKeys, который содержит объекты с ключом enumKey
, представляющим ключи объекта obj.
Теперь, если мы хотим использовать этот массив enumKeys с типами, соответствующими ключам obj, мы можем просто использовать enumKeys[0].enumKey
или обращаться к массиву в цикле, чтобы получить все значения enum.
Вот полный пример кода:
const obj = { key1: 'value1', key2: 'value2', key3: 'value3', }; interface EnumKeys { enumKey: keyof typeof obj; } const enumKeys: EnumKeys[] = Object.keys(obj).map((k) => ({ enumKey: k as keyof typeof obj })); console.log(enumKeys[0].enumKey); // key1 console.log(enumKeys[1].enumKey); // key2 console.log(enumKeys[2].enumKey); // key3
Таким образом, мы можем получить ключи объекта в виде enum, который имеет тот же тип, что и keyof typeof
, без необходимости использовать as
.