是的,如果值以 0 开头,则不会触发错误

Yup don't trigger the error if value typing starts with 0

基本上,我有一个字段需要像这样验证:

export const validationSchemaWithdraw = Yup.object().shape({
  amount: Yup.number()
    .min(1, 'The minimum amount is one')
    .typeError('The amount invalid')
    .required('The amount is required'),
});

如果我键入等于 0 的金额,则会触发错误。但如果值为 01,则什么也不会发生。

如果输入的值以 0 开头,我的字段如何触发错误?

由于您在 yup 模式上将值类型定义为 number,因此输入值将在验证前转换为数字。像“01”这样的值将被解析为 1,这根据您的验证链是有效的。

实现您期望的行为的一种方法是向您的验证链添加自定义 test 函数并测试前导零案例。这需要访问字段的原始值 作为字符串 (在被 yup 强制转换为数字之前),否则前导零将被解析忽略。所以请确保您输入字段的类型是“字符串”。

const SignupSchema = Yup.object().shape({
  amount: Yup.number()
    .min(1, 'The minimum amount is one')
    .typeError('The amount invalid')
    .required('The amount is required')
    .test(
      'no-leading-zero',
      'Leading zero is not allowed',
      (value, context) => {
        return context.originalValue && !context.originalValue.startsWith('0');
      }
    ),
});

另一种选择是将架构中的值类型更改为 string 并使用 matches + 正则表达式检查字符串格式。