You need to enable JavaScript to run this app. React+TypeScript 独立Yup校验schema实现groupID范围校验问题求助
优惠活动
大模型
产品
解决方案
定价
更多

React+TypeScript 独立Yup校验schema实现groupID范围校验问题求助

问题根因与修正方案

核心错误点

  • queryParam的when配置里,依赖字段名写错:原本要基于groupID的值做判断,错误填写了不存在的is_in_list字段,判断逻辑根本不会触发
  • 独立文件下用this.parent.groupID取值完全无效:模块顶层导出的常量作用域中,this不指向Yup的运行时校验上下文,TS无法识别parent属性,运行时也拿不到父级字段值
  • 投票类字段的校验规则不完整:positiveAnswer/negativeAnswer只配置了isVoteType为true时的校验,未配置为false时的规则,容易出现非预期的空值校验报错
  • includes判断缺少空值兼容:如果groupID为undefined(表单未赋值的初始场景),直接调用includes会抛出类型错误

修正后的校验Schema代码

import * as Yup from 'yup';

export const validationSchema = Yup.object().shape({
  text: Yup
    .string()
    .defined()
    .max(2048, "Az üzenet szövege túl hosszú,"),
  groupID: Yup
    .number()
    .min(1),
  queryParam: Yup
    .string()
    // 依赖字段改为实际存在的groupID
    .when("groupID", {
      // 用函数入参接收依赖字段的值,完全不需要this,TS可自动推导类型
      is: (groupID?: number) => {
        // 加判空逻辑兼容表单初始空值场景
        return groupID !== undefined && [2, 3, 4].includes(groupID);
      },
      then: Yup
        .string()
        .defined("Kötelező mező."),
      otherwise: Yup
        .string()
        .nullable()
    }),
  isVoteType: Yup.boolean(),
  positiveAnswer: Yup
    .string()
    .when("isVoteType", {
      is: true,
      then: Yup.string().required("Kötelező mező."),
      // 补全非投票场景的校验规则,允许空值
      otherwise: Yup.string().nullable()
    }),
  negativeAnswer: Yup
    .string()
    .when("isVoteType", {
      is: true,
      then: Yup.string().required("Kötelező mező."),
      otherwise: Yup.string().nullable()
    })
});

关键修改说明

  • 彻底替换this取值逻辑:Yup的when配置支持将is设为函数,函数入参就是第一个参数指定的依赖字段的当前值,既解决了独立模块下this指向错误的问题,也能让TS自动推导字段类型,不会再出现属性无法识别的报错
  • 修正依赖字段名:必须填写要关联的实际表单字段名,才能正确触发对应条件的校验逻辑
  • 补全判空与分支规则:兼容表单初始加载时的空值场景,避免非预期的校验报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 19:45:10