You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:15:00