You need to enable JavaScript to run this app. TypeScript反转Enum时报隐式any类型错误的原因及解决方法
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript反转Enum时报隐式any类型错误的原因及解决方法

报错原因

  • 你初始化的newObj被TypeScript自动推断为{}(空对象类型),该类型没有预定义合法的索引签名,TypeScript无法确认动态字符串键的赋值操作是否合规,因此触发了隐式any类型的报错。
  • 你的参数类型定义存在错误:obj: MyEnum的写法是将入参限定为枚举成员值(例如MyEnum.Colors),而你实际需要传入的是枚举对象本身,枚举对象的正确类型应为typeof MyEnum。
  • Object.keys()返回值的默认类型是string[],直接用string类型的返回值去索引枚举对象,也会触发索引类型不匹配的校验错误。

解决方法

方案1(保留完整类型推导,适配任意字符串枚举)

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

const reverseEnum = <T extends Record<string, string>>(obj: T) => {
  // 显式定义反转后对象的索引类型
  const newObj: Record<T[keyof T], keyof T> = {} as Record<T[keyof T], keyof T>;
  // 类型断言Object.keys的返回值,匹配枚举的键类型
  (Object.keys(obj) as Array<keyof T>).forEach((x) => {
    newObj[obj[x]] = x;
  });
  return newObj;
};

// 使用后menuTitle会自动获得类型:Record<"AreColors" | "AreCars", "Colors" | "Cars">
const menuTitle = reverseEnum(MyEnum);

方案2(快速修复报错,无需复杂类型定义)

如果不需要严格的类型推导,直接给newObj声明通用的字符串索引类型即可:

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

const menuTitle = ((obj: typeof MyEnum) => {
  const newObj: Record<string, string> = {};
  Object.keys(obj).forEach((x) => {
    newObj[obj[x as keyof typeof MyEnum]] = x;
  });
  return newObj;
});

内容的提问来源于stack exchange,提问作者Asking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 11:45:04