TypeScript中如何判断函数返回值是枚举还是自定义类型?
TypeScript区分联合类型中的枚举成员与对象类型
先看你的代码:
enum MyEnum { Enum1, Enum2, Enum3, Enum4, }; type MyType = { a: number; b: string; } function myFunc(x: number): MyEnum | MyType { return MyEnum.Enum4; } const y = myFunc(55);
你想判断y是MyEnum的成员还是MyType类型的对象,但用(y in MyEnum)时出现编译错误:
TS2360: "in"表达式的左侧必须是私有标识符或"any"、"string"、"number"、"symbol"类型。
问题原因
in操作符的左侧要求是属性名(字符串、数字、符号类型),而y是MyEnum | MyType联合类型,可能是数字或对象,当y是对象时,不符合in操作符对左侧类型的要求,因此报错。
解决方案
可以通过以下几种方式实现类型判断:
1. 利用类型与枚举特性直接判断
默认枚举成员是数字类型,而MyType是对象类型,可先通过typeof做基础判断:
if (typeof y === 'number') { // 此时y被类型收窄为MyEnum console.log(`y是枚举成员:${y}`); } else { // 此时y被类型收窄为MyType console.log(`y是MyType对象:${y.a}, ${y.b}`); }
如果需要更严谨(避免数字刚好匹配枚举值的误判),可结合枚举的反向映射验证:
if (typeof y === 'number' && MyEnum[y] !== undefined) { // y是MyEnum的有效成员 } else { // y是MyType对象 }
2. 自定义类型守卫函数
如果需要更清晰的语义或应对复杂类型判断,可定义类型守卫:
function isMyEnum(val: MyEnum | MyType): val is MyEnum { return typeof val === 'number' && Object.values(MyEnum).includes(val); } function isMyType(val: MyEnum | MyType): val is MyType { return typeof val === 'object' && val !== null && 'a' in val && 'b' in val; } // 使用示例 if (isMyEnum(y)) { console.log(`枚举值:${MyEnum[y]}`); } else if (isMyType(y)) { console.log(`对象属性a:${y.a}, b:${y.b}`); }
内容的提问来源于stack exchange,提问作者Saqib Ali
相关产品推荐
相关产品推荐

