如何让TypeScript识别运行时变量的指定类型?解决类型赋值报错
解决TypeScript中string | Enum类型参数返回Enum的类型错误
你的TextToEnum函数逻辑没问题,但类型判断的写法错误,导致TypeScript无法正确识别分支类型,从而抛出类型不兼容的错误。
错误原因
typeof text === typeof MyEnum这个判断完全无效:
typeof MyEnum得到的是"object"(因为枚举本身是包含映射关系的对象)- 而
MyEnum的枚举值是数字类型,typeof 枚举值得到的是"number"
所以这个条件永远不会成立,TypeScript无法确定return text时返回的是MyEnum类型,依然认为可能返回string,触发类型错误。
修正方案
根据你的数字枚举类型,可选择以下几种修复方式:
方案1:直接判断类型为number
因为你的MyEnum是数字枚举,所有枚举值本质都是number类型,直接判断类型即可:
export enum MyEnum { Value1 = 1, Other = 10 } export function TextToEnum(text: string | MyEnum): MyEnum { if (typeof text === "number") { return text; } switch (text) { case "val1": return MyEnum.Value1; default: return MyEnum.Other; } }
方案2:通用枚举检查(支持数字/字符串枚举)
如果后续可能改成字符串枚举,或者需要更严谨的枚举成员校验,可以用Object.values判断是否属于枚举的有效成员:
export enum MyEnum { Value1 = 1, Other = 10 } export function TextToEnum(text: string | MyEnum): MyEnum { if (Object.values(MyEnum).includes(text as MyEnum)) { return text as MyEnum; } switch (text) { case "val1": return MyEnum.Value1; default: return MyEnum.Other; } }
方案3:自定义类型守卫(更优雅的类型判断)
封装类型守卫函数,让TypeScript更清晰地识别类型:
export enum MyEnum { Value1 = 1, Other = 10 } function isMyEnum(value: unknown): value is MyEnum { return Object.values(MyEnum).includes(value as MyEnum); } export function TextToEnum(text: string | MyEnum): MyEnum { if (isMyEnum(text)) { return text; } switch (text) { case "val1": return MyEnum.Value1; default: return MyEnum.Other; } }
以上三种方案都能解决类型错误,可根据实际场景选择。
内容的提问来源于stack exchange,提问作者Dušan
相关产品推荐
相关产品推荐

