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
相关产品推荐
相关产品推荐

