yup.js 验证数字字段大于同级,或者可为空

yup.js Validate number field is larger than sibling, or nullable

我正在使用 Yup.js 来验证一些表单域。

我有两个整数字段,Year BuiltYear Renovated

Year Built 是必填字段,Year Renovated 不是。

翻新年份可以留空,但是如果有值它应该大于建造年份(因为翻新肯定必须在建造日期之后发生)。

我相信我需要使用 yup 的 ref() 以及 yup 的 when() 功能。我尝试了以下方法:

let currentYear = new Date().getFullYear();

yup.object().shape({
  yearBuilt     : yup.number().integer().min(1700).max(currentYear+1).required(),
  yearRenovated : yup.number().integer().when(
                    '$yearRenovated', (yearRenovated, schema)=>{
                        return yearRenovated > 0 ? 
                            schema.min(yup.ref('yearBuilt')).max(currentYear+1) :
                            schema.transform(emptyStringToNull).nullable()
                    }
                )
})

* 转换函数 emptyStringToNull 简单地检查 value === '' 和 returns 是否为空。

上面确实允许空值,并且正确地检查了整数。但是它没有正确评估 yearRenovated > yearBuilt。如何正确检查 yearRenovated 是否不为空,它是否大于 yearBuilt

非常感谢大家的帮助。

@JQuense,repo 的所有者有一个 eloquent 解决方案,使用 moreThan():

const schema = yup.object().shape({
    yearBuilt: yup
      .number()
      .integer()
      .min(1700)
      .max(currentYear+1)
      .required(),
    yearRenovated: yup
      .number()
      .integer()
      .nullable()
      .moreThan(yup.ref("yearBuilt")) //<-- a whole lot neater than using a when conditional...
      .max(currentYear+1)
});

希望对您有所帮助!谢谢@JQuense。

const schema = Yup.object({
  // -- snip --
  billAmount: Yup.number().nullable(),
  approvedAmount: Yup.number()
    .typeError("you must specify a number")
    .notRequired()
    .when("billAmount", (billAmount: any, schema: any) => {
      return schema.test({
        test: (approvedAmount: any) => {
          if (!approvedAmount) return true;
          return approvedAmount < billAmount;
        },
        message: "Approved Amount not gether then billAmount",
      });
    }),
});

是(小于或等于):https://github.com/jquense/yup/issues/538#issuecomment-495340254

如果您最终需要小于或等于实现 (<=),请考虑:

number().max(5) // is <= 5