我对yup
的工作原理有点困惑。
我使用以下模式来验证寄存器
export const registerValidationSchema = yup.object().shape({
first_name: yup.string().trim().required(),
last_name: yup.string().trim().required(),
date_of_birth: yup.date().required().test('DOB', 'You must be at least 18 to register', value => {
return value.setFullYear(value.getFullYear() + 18) < Date.now()
}),
email: yup.email().trim().required()
});
当要验证的对象为以下对象时
const data = {
email: "john.doe@company.com"
}
验证会崩溃,因为value
未定义,函数value.setFullYear
会失败。但是为什么呢?我假设yup会在.required()
部分停止这一行,并转到下一个属性。
我知道这个问题可以通过在.test()
中添加if(!value) return false;
来解决,但是所需函数的意义何在?
来自yup文档:
- 字符串。必需(消息?:弦|函数):架构**
与mixed()模式所需的相同,只是空字符串也被视为"缺少"值。
- 混合。必填(消息?:弦|函数):架构**
将方案标记为required,这将不允许值为undefined或null。请注意,除非将方案标记为nullable(),否则null值将被视为类型错误,而不是缺少值。将方案标记为mixed()。nullable(). required()将null视为缺少值。
因此,我将其理解为undefined
、null
或''
值应在.required()
规则上失败。
2条答案
按热度按时间a11xaf1n1#
当需要更细粒度的控制时,我使用下面的
yup.mixed
结构。例如,当验证FileList
时。希望它能让你更进一步。hwazgwia2#
代替
email: yup.email().trim().required()
尝试
email: yup.string().trim().email().required()
在github文档中找到