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

react-hook-form结合yup时手机号空提交显示类型错误而非必填错误

问题根因

yup对number类型字段的校验优先级为先做类型校验,再执行必填规则校验:
你表单中的手机号输入框是type="text",留空时提交的原始值是空字符串'',yup尝试将空字符串转为数字会得到NaN,直接触发typeError报错,根本不会走到后续required规则的校验逻辑。

解决方案

提供两种可行方案,按需选择:

方案1:转换空值为undefined,适配number类型校验

给phoneNumber规则添加transform钩子,空串输入时转成undefined,即可触发required校验:

const schema = yup.object().shape({
  name: yup.string().required("Field is required*"),
  email: yup.string().email().required("Field is required*"),
  phoneNumber: yup
    .number()
    // 新增transform逻辑
    .transform((value, originalValue) => originalValue === '' ? undefined : value)
    .required("Field is required*")
    .typeError("Value must be a number*"),
  message: yup.string().required("Please provide your message*")
});

方案2:改用string类型校验手机号(更推荐)

手机号本质是字符串序列(可能存在前导零、国家码前缀等场景,存为number会丢失信息或出现精度问题),直接用string类型加正则校验更合理:

const schema = yup.object().shape({
  name: yup.string().required("Field is required*"),
  email: yup.string().email().required("Field is required*"),
  phoneNumber: yup
    .string()
    .required("Field is required*")
    .matches(/^[0-9]+$/, "Value must be a number*"),
  message: yup.string().required("Please provide your message*")
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:45:03