Трудно найти элегантный способ справиться с этим, не натыкаясь на проблемы циклической зависимости. Мне удалось заставить что-то работать, используя .alternatives()
и .try()
.
Решение в необработанном виде будет таким:
Joi.alternatives().try(
Joi.object().keys({
a: Joi.string().required(),
b: Joi.string().required(),
c: Joi.string().required().valid('')
}),
Joi.object().keys({
a: Joi.string().required().valid(''),
b: Joi.string().required(),
c: Joi.string().required()
}),
Joi.object().keys({
a: Joi.string().required(),
b: Joi.string().required().valid(''),
c: Joi.string().required()
})
);
Это, конечно, не очень красиво и может сильно раздуться, если будут введены дополнительные зависимости.
В попытке уменьшить количество повторений также будет работать следующее:
var base = {
a: Joi.string().required(),
b: Joi.string().required(),
c: Joi.string().required()
};
Joi.alternatives().try(
Joi.object().keys(Object.assign({}, base,
{
a: base.a.valid('')
})),
Joi.object().keys(Object.assign({}, base,
{
b: base.b.valid('')
})),
Joi.object().keys(Object.assign({}, base,
{
c: base.c.valid('')
}))
);
person
Ankh
schedule
19.01.2018