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

TypeScript中关联枚举的数据模型如何正确比较__typename字段?

正确比较枚举类型__typename的方案

问题根因

你现在的写法永远返回false,核心是因为TypeScript默认定义的无赋值枚举是数字枚举:你定义的ActivtiyCardType中,ActivtiyCardType.Dance实际运行时值为数字0,ActivtiyCardType.ReferralTransaction值为数字1,而__typename的类型是数字,和字符串'Dance'做全等判断自然不成立。


两种适配方案

根据你数据源(后端/接口)返回的__typename实际值选择对应方案:

方案1:数据源返回字符串类型的枚举值(最常用场景)

先把枚举修改为字符串枚举,明确指定每个枚举成员的运行时值和字符串一致:

enum ActivtiyCardType  {
    Dance = 'Dance',
    ReferralTransaction = 'ReferralTransaction',
}

比较时直接引用枚举成员,不要硬编码字符串,既避免拼写错误,也能享受TS类型校验:

{activity.__typename === ActivtiyCardType.Dance ? (
  // Dance类型卡片的渲染逻辑
) : (
  // 其他类型卡片的渲染逻辑
)}

方案2:数据源返回数字类型的枚举值

不需要修改枚举定义,直接引用枚举成员做判断即可:

{activity.__typename === ActivtiyCardType.Dance ? (
  // Dance类型卡片的渲染逻辑
) : null}

进阶优化:添加类型守卫自动收窄类型

如果后续不同枚举值对应的ActivityCardData有差异化字段,可以定义类型守卫函数,让TS自动识别对应类型的字段,避免类型报错:

// 定义Dance类型的类型守卫
function isDanceActivity(activity: ActivityCardData): activity is ActivityCardData & { __typename: typeof ActivtiyCardType.Dance } {
  return activity.__typename === ActivtiyCardType.Dance
}

业务代码中使用:

{data?.map((activity) => {
  if (isDanceActivity(activity)) {
    // 此处TS会自动识别activity为Dance类型,可直接调用该类型特有的字段
    return <div>{activity.danceSuccessful ? '舞蹈成功' : '舞蹈失败'}</div>
  }
  return <div>其他类型卡片</div>
})}

内容的提问来源于stack exchange,提问作者DEV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:05