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

Yup同Schema含可选字段时,必填字段验证失效问题

Yup表单验证异常:仅提交必填字段时验证失效的解决办法

问题场景

我用Yup做表单验证,仅将name设为必填项,last_name和document为可选字段,验证Schema如下:

const contatoCadastroSchema = yup.object().shape({
    name: yup.string().min(3, 'Mínimo de 3 letras').required('Nome é obrigatório'),
    last_name: yup.string().min(3, 'Mínimo de 3 letras').notRequired(),
    document: yup.string().test('cpf-validação', 'O CPF deve ser válido', (value) => validarCPF(value)).notRequired()
});

但出现异常:只有提交其他可选字段时,name的必填验证才生效;单独提交name时,必填验证直接失效。尝试以下操作后name验证恢复正常:移除其他字段的验证规则、将可选字段设为必填,或仅删除document的test验证。

问题原因

问题出在document字段的自定义test函数上。当仅提交name时,document的值为undefined或空字符串,此时Yup会执行该test函数,若你的validarCPF函数在处理空值/undefined时返回false,会干扰整个Schema的验证逻辑,导致name的必填验证被意外跳过。

解决办法

给document的test函数添加前置判断,空值时直接返回true以跳过验证:

const contatoCadastroSchema = yup.object().shape({
    name: yup.string().min(3, 'Mínimo de 3 letras').required('Nome é obrigatório'),
    last_name: yup.string().min(3, 'Mínimo de 3 letras').notRequired(),
    document: yup.string()
        .test('cpf-validação', 'O CPF deve ser válido', (value) => {
            // 空值/undefined时直接通过验证
            if (!value) return true;
            return validarCPF(value);
        })
        .notRequired()
});

也可以用nullable()配合test实现同样效果:

document: yup.string()
    .nullable()
    .test('cpf-validação', 'O CPF deve ser válido', (value) => {
        return value ? validarCPF(value) : true;
    })
    .notRequired()

补充说明

Yup的对象验证是整体执行的,自定义test函数处理可选字段时,必须明确空值的处理逻辑。若空值时返回false,Yup会判定该字段验证失败,进而可能干扰其他字段的验证判断,引发这类看似无关的异常。

内容的提问来源于stack exchange,提问作者Amanda M Costa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:21:04