如何验证 Yup 中的备选方案?

How to validate alternatives in Yup?

我习惯了 Joi 验证语法,但现在正在尝试将一些代码迁移到 Yup 语法。

在 Joi 中,我曾经这样做过:

  field: Joi.alternatives().try(
    Joi.number(),
    Joi.string(),
  )

这会使该字段成为数字或字符串。

如何使用 Yup 实现?

更新:

我创建了一个更好的解决方案,它适用于您传递的任意数量的任何架构类型!

首先定义一个名为oneOfSchemas

的方法
yup.addMethod(yup.MixedSchema, "oneOfSchemas", function (schemas) {
  return this.test(
    "one-of-schemas",
    "Not all items in ${path} match one of the allowed schemas",
    (item) =>
      schemas.some((schema) => schema.isValidSync(item, { strict: true }))
  );
});

然后你使用它如下:

title: yup
  .mixed()
  .oneOfSchemas([
    yup
      .object()
      .noUnknown()
      .shape(SchemaObject1),
    yup
      .object()
      .noUnknown()
      .shape(SchemaObject2),
  ]),

灵感来自 https://gist.github.com/cb109/8eda798a4179dc21e46922a5fbb98be6

这是我找到的唯一方法,如果我错了或者你有更好的答案,请指正:

field: yup.lazy((val) => (isNaN(val) ? yup.string() : yup.number()))

然而,当备选方案是对象时,这将不起作用,我想找到解决方案。