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

TypeScript中如何为含CLOSED值的枚举编写通用函数

解决方案:约束函数仅接受含'CLOSED'的枚举类型

不用搞公共枚举,直接靠泛型类型约束就能实现,完全不依赖具体的枚举定义,TS 4.9.4也能正常用。

具体代码实现

先定义你的const枚举:

const enum E1 {
  OPEN = 'OPEN',
  CLOSED = 'CLOSED'
}

const enum E2 {
  PENDING = 'PENDING',
  CLOSED = 'CLOSED'
}

const enum E3 {
  OPEN = 'OPEN',
  IN_PROGRESS = 'IN_PROGRESS'
}

然后写带泛型约束的函数:

function handleClosedEnum<T extends { CLOSED: T[keyof T] }>(enumObj: T) {
  // 这里可以放心用 enumObj.CLOSED
  console.log(enumObj.CLOSED);
}

测试效果

  • 传E1、E2完全没问题:
handleClosedEnum(E1); // 正常通过类型检查
handleClosedEnum(E2); // 正常通过类型检查
  • 传E3会直接报错,符合预期:
handleClosedEnum(E3); // TS报错:类型'E3'缺少属性'CLOSED'

为啥之前直接设'CLOSED'会报错?

你之前把参数类型指定为'CLOSED',但函数要的是枚举类型本身,不是枚举成员的值,类型不匹配肯定报错。上面的泛型写法是约束枚举类型必须包含CLOSED这个键,刚好贴合你的需求。

关于const enum的兼容问题

因为是const enum,编译时TS会直接把枚举替换成对应值,但类型检查阶段完全不受影响,这个写法在TS 4.9.4上运行毫无问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:22:06