Angular12项目中如何将任意类型值转换为Policy枚举类型?
问题原因
你使用的是TypeScript默认的数字枚举,这类枚举会生成**正向映射(名称→数字)+反向映射(数字→名称)**两套映射关系,默认的枚举类型索引签名仅支持number类型的索引,所以你直接用string类型作为索引访问枚举对象时,就会触发隐式any的类型报错。
解决方案
方案1:直接断言索引类型(最简单,适用于确定输入值合法的场景)
直接将输入的字符串断言为枚举的键类型即可,代码如下:
let policy: Policy = Policy[route.data.policy as keyof typeof Policy];
这里typeof Policy拿到的是枚举对象本身的类型,keyof typeof Policy就等价于联合类型'Admin' | 'Manager',刚好匹配你输入的合法取值范围,类型校验就可以正常通过。
方案2:添加类型守卫(更安全,兼容非法输入场景)
如果不能100%保证输入值一定是合法的枚举键,可以加个类型校验函数,避免运行时报错:
// 类型守卫函数,判断输入值是否为合法的Policy枚举键 function isPolicyKey(key: unknown): key is keyof typeof Policy { return typeof key === 'string' && Object.keys(Policy).includes(key); } // 业务代码使用 const policyInput = route.data.policy; let policy: Policy; if (isPolicyKey(policyInput)) { policy = Policy[policyInput]; } else { // 此处可以自定义非法输入的处理逻辑,比如赋值默认值、抛出异常等 policy = Policy.Admin; console.error('非法的policy取值:', policyInput); }
方案3:修改为字符串枚举(可选,后续使用更便捷)
如果业务允许调整枚举定义,可以直接把枚举改成字符串枚举,就不需要走反向映射查询了:
// 修改枚举定义 export enum Policy { Admin = 'Admin', Manager = 'Manager' } // 直接使用,无需反向查询 let policy: Policy = route.data.policy as Policy;
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

