是的:如何在投射失败后获得错误信息?

Yup: how to get error message after failed cast?

我正在使用 yup 进行验证,我想尝试这种令人惊叹的 cast 方法,但是文档中并不清楚,我如何在失败的情况? cast 转换和验证并 returns 结果或 returns null 就是这样。这是不可接受的 - 我还需要一条错误消息。同时我不想 运行 它两次,比如 - 一次用于验证,一次用于转换。

cast either transforms and validates and returns the result or returns null and that's it

cast validate 结果 - 它只是转换它。 validate(Sync)/isValid(Sync) 强制转换然后验证。

如果你想在转换失败的情况下提供关于特定模式的错误消息,你可以使用 typeError

At the same time I wouldn't want to run it twice, like - once for validation, once for cast.

正如我所说,验证方法总是在验证之前先 运行 转换(如果转换失败,则不会 运行 验证)。如果你想要转换和验证功能,那么你只需调用验证方法,它 returns 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),
  • 注释部分是不必要的并在转换中替换
  • 之所以抛出nested Validation Error,完全是因为我的错误解析逻辑。