如何验证 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()))
然而,当备选方案是对象时,这将不起作用,我想找到解决方案。
我习惯了 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()))
然而,当备选方案是对象时,这将不起作用,我想找到解决方案。