我正在使用yup
进行验证,我想尝试一种令人惊叹的强制转换方法,但从文档中还不清楚,在失败的情况下如何获得错误消息?cast
要么转换并验证并返回结果,要么返回null
。这是不可接受的——我还需要一条错误消息。同时,我不想运行两次,比如一次用于验证,一次用于强制转换。
cast要么转换并验证并返回结果,要么返回null,这就是
cast
不validate
结果-它只是对其进行转换。validate(Sync)/isValid(Sync)
进行强制转换,然后进行验证。
如果您想在转换失败的情况下提供特定模式的错误消息,请使用typeError
同时我不想运行两次,比如一次用于验证,一次用于强制转换。
正如我所说,validate方法总是在验证之前先运行强制转换(如果强制转换失败,则不运行验证(。如果你想要强制转换和验证功能,那么你只需要调用验证方法,它就会返回cast
结果(如果有效(——除非你只想强制转换(不进行验证(,否则你不需要调用cast
。
您可以随时抛出验证错误。
以下是我的完整实现:
phone: yup
.string()
// .test('is-valid', 'phone.invalid', async (value) => {
// if (typeof value === 'string') {
// const number = phoneUtil.parseAndKeepRawInput(value, 'TR');
// return phoneUtil.isValidNumber(number);
// }
// return false;
// })
.transform((value) => {
if (typeof value === 'string') {
const number = phoneUtil.parse(value, 'TR');
if (phoneUtil.isValidNumber(number)) {
return phoneUtil.format(number, PhoneNumberFormat.E164);
}
}
throw new ValidationError(
new ValidationError('phone.invalid', value, 'phone', 'is-valid')
);
})
.required()
.nullable(false),
- 注释部分是不必要的,并在转换中被替换
- 抛出嵌套Validation Error的原因完全是因为我的错误解析逻辑