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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:42:45