Вы можете использовать Joi.alternatives () и создать схему Joi следующим образом:
Joi.alternatives().try(
Joi.object({
a: Joi.number().required(),
b: Joi.number().required(),
c: Joi.number(),
d: Joi.number()
}),
Joi.object({
a: Joi.number().required(),
b: Joi.number(),
c: Joi.number().required(),
d: Joi.number()
}),
Joi.object({
a: Joi.number(),
b: Joi.number(),
c: Joi.number(),
d: Joi.number().required()
}),
)
Существует другая альтернатива, которая использует .requiredKeys () и упрощает код выше:
const JoiObjectKeys = {
a: Joi.number(),
b: Joi.number(),
c: Joi.number(),
d: Joi.number()
}
Joi.alternatives().try(
Joi.object(JoiObjectKeys).requiredKeys('a', 'b'),
Joi.object(JoiObjectKeys).requiredKeys('a', 'c'),
Joi.object(JoiObjectKeys).requiredKeys('d'),
);
С этой схемой вы получите следующие результаты:
{ a: 1 } > fails
{ b: 1 } > fails
{ c: 1 } > fails
{ a: 1, b: 1 } > passes
{ a: 1: c: 1 } > passes
{ d: 1 } > passes
{ d: 1, a: 1 } > passes