使用变量正则表达式测试对两个相关字段进行验证

Validation with two related fields with variable regex test

所以我有一个世界范围内的国家/地区列表,我想验证欧盟国家/地区的增值税/税号。

这是 countries array 的示例:

  {
    name: "Belarus",
    dialCode: "+375",
    code: "BY"
  },
  {
    name: "Belgium",
    dialCode: "+32",
    code: "BE",
    EU: true,
    vatPrefix: "BE",
    regex: `0[0-9]{9}`
  },
...

我有 countriestax number 字段,但到目前为止我无法区分一个国家/地区是否来自欧盟。 这是我的验证码(无效):

 return Yup.string().when("???", {
    is: "EU",
    then: schema.test("regexPattern", t("validation.invalidValue"), (value: unknown) =>
    regexPattern.test(String(value))
  ),
    otherwise: Yup.string()
    .trim()
    .min(5, t("validation.minLength", { minLength: 5}))
    .required(t("validation.required"));
  });

我试图从 countryField 获取 countryCode 并以此查询 countries array 如果它有一个正则表达式然后将变量传递给正则表达式验证.但是我不知道该怎么做。

这与 this question 非常相似,但我们的方法完全不同,因为我还需要处理欧盟以外的国家/地区。

好吧,显然我遗漏了一些可以在这里使用的功能!

这是我的解决方案:

Yup.string().when("countryCode", {
    is: value => {
      const country = getCountryBy.code(value);
      return country?.EU;
    },
    then: validateAgainstRegexps(getEuCountries.regex()),
    otherwise: Yup.string()
      .trim()
      .min(genericTaxIdMinLength, t("validation.minLength", { minLength: genericTaxIdMinLength }))
      .required(t("validation.required"))
  });

我需要做的就是在 .when() 中添加逻辑,如 here 所述:is: (value) => value == true 我认为它只接受等式 (===).