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
相关产品推荐
相关产品推荐

