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

Formik结合Yup字符串校验失效,搭配Material UI TextField或Formik组件均无效

问题根因

Yup的string()类型校验默认开启了自动类型转换,你在输入框中输入的数字内容会被自动转为字符串格式,因此不会触发类型错误。例如输入123会被先转成"123"再校验,完全符合string类型要求,所以你看不到相关报错。

解决方案

方案1:关闭Yup自动类型转换

直接在对应字段的校验规则中添加strict(true),禁止自动类型转换,同时可通过typeError自定义类型错误提示:

const validationSchema = yup.object({
    id: yup
        .string()
        .strict(true) // 禁用自动类型转换
        .typeError("该字段必须输入字符串内容") // 自定义类型错误提示
        .min(1, "请输入长度大于1的ID")
        .required("该字段为必填项"),
    // 其余需要校验字符串类型的字段可按同样规则配置
})

方案2:添加自定义格式校验

如果你不想关闭全局类型转换,可以新增自定义test规则,对内容格式做限制,比如禁止输入纯数字内容:

id: yup
    .string()
    .test('not-pure-number', 'ID不能为纯数字', value => {
        // 纯数字内容返回false触发报错,你可根据需求调整判断逻辑
        return isNaN(Number(value))
    })
    .min(1, "请输入长度大于1的ID")
    .required("该字段为必填项")

方案3:输入时直接拦截非法内容

如果需要实现「非字符串内容直接拒绝录入」的效果,可重写输入框的onChange事件,在内容写入Formik状态前就做拦截:

<TextField
    fullWidth
    id="id"
    name="id"
    label="ID"
    value={formik.values.id}
    onChange={(e) => {
        const inputValue = e.target.value
        // 自定义判断逻辑,比如纯数字内容直接不更新表单
        if (!isNaN(Number(inputValue))) return
        formik.handleChange(e)
    }}
    error={formik.touched.id && Boolean(formik.errors.id)}
    helperText={formik.touched.id && formik.errors.id}
/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:42:03