Yup 1.0.0通用枚举解析报错,求适配TypeScript泛型方案
Yup 1.0.0 适配通用枚举验证方案
问题原因
Yup 1.0.0 对类型系统做了严格升级,mixed().oneOf() 要求传入的枚举成员必须符合 AnyPresentValue 约束(即非 undefined/null 的有效值),旧代码的泛型 T 没有明确满足该约束,导致类型报错。
适配后的代码
导入Yup提供的AnyPresentValue类型,约束泛型T,并处理TS数字枚举的双向映射问题(避免把枚举的键名混入验证值列表):
import { AnyPresentValue, mixed } from 'yup'; export const oneOfEnum = <T extends AnyPresentValue>(enumObject: Record<string, T> | ArrayLike<T>) => { // 过滤数字枚举中混入的字符串键名 const enumValues = Object.values(enumObject).filter(value => typeof value !== 'string') as T[]; return mixed<T>().oneOf(enumValues); };
关键修改点
- 给泛型
T添加extends AnyPresentValue约束,匹配Yup 1.0.0的类型要求 - 增加过滤逻辑:TS数字枚举编译后会生成双向映射(键→值、值→键),用
filter剔除字符串类型的键名,确保验证值仅为枚举成员本身
使用示例
// 数字枚举示例 enum Status { Active = 1, Inactive = 2 } // 字符串枚举示例 enum Role { Admin = 'ADMIN', User = 'USER' } // 生成验证规则 const statusSchema = oneOfEnum(Status); const roleSchema = oneOfEnum(Role);
内容的提问来源于stack exchange,提问作者A Question Asker
相关产品推荐
相关产品推荐

