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

Yup从0.29升级至1.2后的字段Schema类型标注问题求助

Yup 1.2 版本字段Schema类型标注解决方案

核心问题

从 Yup 0.29 升级到 1.2 后,旧版通用 Schema 类型不再适配所有场景,使用 yup.reach 获取对象字段的 Schema 时,返回类型为 Reference | ISchema,但 Reference 未直接导出,导致传递给函数时出现类型不兼容报错。

解决方案

1. 使用 SchemaOf<T> 明确类型约束

Yup 1.2 提供了 SchemaOf<T> 泛型,用于定义对应数据类型的 Schema,能精准匹配字段类型,避免模糊的通用类型:

import * as yup from 'yup';
import type { SchemaOf, InferType } from 'yup';

interface MyType {
  id: number;
  name: string;
}

const mySchema = yup.object<MyType>({
  id: yup.number().required(),
  name: yup.string().required(),
}).required();

// 提取对象字段的类型,定义对应Schema类型
type MyTypeFieldSchemas = {
  id: SchemaOf<InferType<typeof mySchema>['id']>;
  name: SchemaOf<InferType<typeof mySchema>['name']>;
};

// 断言reach返回的类型为对应字段的Schema
const idSchema = yup.reach(mySchema, 'id') as MyTypeFieldSchemas['id'];
const nameSchema = yup.reach(mySchema, 'name') as MyTypeFieldSchemas['name'];

2. 优化函数参数的类型标注

针对接收字段 Schema 的函数,可通过泛型或具体 Schema 子类(如 NumberSchema、StringSchema)来约束类型,避免报错:

// 方案一:泛型函数适配任意字段类型
function validateField<T>(fieldSchema: SchemaOf<T>) {
  return (value: unknown) => fieldSchema.validate(value);
}

// 方案二:重载函数针对不同类型做精准处理
function validateField(fieldSchema: yup.NumberSchema): Promise<number>;
function validateField(fieldSchema: yup.StringSchema): Promise<string>;
function validateField(fieldSchema: yup.Schema) {
  return fieldSchema.validate("TEST");
}

// 调用时不再报错
validateField(idSchema);
validateField(nameSchema);

3. 处理 Reference 类型

若需要兼容 yup.reach 可能返回的 Reference,可通过类型守卫过滤或解析:

// 类型守卫判断是否为Schema实例
function isSchema(schema: unknown): schema is yup.Schema {
  return typeof schema === 'object' && schema !== null && 'validate' in schema;
}

function validateField(fieldSchema: yup.ReferencedSchema) {
  if (isSchema(fieldSchema)) {
    fieldSchema.validate("TEST");
  } else {
    // 解析Reference为实际Schema
    const resolvedSchema = fieldSchema.resolve(yup.object());
    resolvedSchema.validate("TEST");
  }
}

最佳实践

  • 优先使用 SchemaOf<T> 绑定数据类型与 Schema,提升类型安全性;
  • 对 yup.reach 返回值使用类型断言,明确字段对应的具体 Schema 子类;
  • 针对多类型场景,用函数重载或泛型实现灵活适配,避免通用类型的模糊性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:43:22