首页 > 解决方案 > 反转打字稿中的枚举

问题描述

我有下一个代码:

enum MyEnum {
  Colors = 'AreColors',
  Cars = 'AreCars',
}

const menuTitle = ((obj: MyEnum) => {
  const newObj = {};
  Object.keys(obj).forEach((x) => {
    newObj[obj[x]] = x;
  });
  return newObj;
});

在这里,我想更改枚举键来代替枚举值。
这样做我到Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'了这里newObj[obj[x]] = x;
为什么会出现问题以及如何解决?

标签: javascripttypescript

解决方案


您的代码有几个问题:

  1. 如果你想通过作为对象传入来反转枚举的键值对MyEnum,那么你需要使用obj: typeof MyEnum. 这是假设您要用于menuTitle(MyEnum)执行反转。
  2. Object.keys(obj)将返回一个字符串数组,这会导致您的枚举出现索引问题。如果你将它转换为一个数组,keyof typeof MyEnum那么它将起作用。

改进的代码:

enum MyEnum {
  Colors = 'AreColors',
  Cars = 'AreCars',
}

const menuTitle = ((obj: typeof MyEnum) => {
  const newObj: { [key in MyEnum]?: keyof typeof MyEnum } = {};
  (Object.keys(obj) as Array<keyof typeof MyEnum>).forEach((x) => {
    newObj[obj[x]] = x;
  });
  return newObj;
});

console.log(menuTitle(MyEnum));

请参阅TypeScript Playground上的概念验证示例。


推荐阅读