Как вернуть ключ enum того-же типа, что и keyof typeof без использования as?

В 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.