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

Yup使用matches校验非必填字段仍触发数字格式报错问题求助

Yup非必填字段空值触发校验报错修复

核心原因

  • yup.string()类型默认将空字符串""识别为有效字符串入参,.notRequired()方法仅对null、undefined值生效,标记这两类值不需要通过必填校验,不会拦截空字符串进入后续校验链,因此空值提交时会正常执行matches正则校验,触发「only digits」错误。

可用修复方案

方案1:空值前置转换(全版本兼容,优先使用)

在校验链起始位置增加值转换逻辑,将无实际内容的空字符串转为undefined,Yup遇到undefined值会自动跳过后续所有非必填类校验规则:

yup.string()
  // 空内容转undefined,跳过后续格式、长度校验
  .transform(value => value?.trim() === '' ? undefined : value)
  .notRequired()
  .matches(/^[0-9]+$/, 'only digits')
  .min(10, 'exactly 10 digits')
  .max(10, 'exactly 10 digits')

方案2:条件分支校验

通过when方法做判断,仅当字段存在有效输入值时,才挂载格式、长度校验规则:

yup.string()
  .notRequired()
  .when({
    is: val => val && val.trim().length > 0,
    then: rule => rule
      .matches(/^[0-9]+$/, 'only digits')
      .min(10, 'exactly 10 digits')
      .max(10, 'exactly 10 digits')
  })

注意事项

  • 若业务场景允许输入数字间空格,可将正则恢复为/^[0-9 ]+$/,但需要同步调整长度校验逻辑,避免空格占用字符位导致实际数字长度不符合10位要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:54:20