Я добился того же, немного по-другому. Публикация того же здесь, так как это может быть полезно для кого-то в будущем.
const schema = Joi.object({
type: Joi.number().required().valid(1, 2, 3),
firstname: Joi.alternatives().conditional('type', { is: 1, then: Joi.string().required() }),
lastname: Joi.alternatives().conditional('type', { is: 1, then: Joi.string().required() }),
salary: Joi.alternatives().conditional('type', { is: 2, then: Joi.number().required() }),
pension: Joi.alternatives().conditional('type', { is: 2, then: Joi.number().required() }),
credit: Joi.alternatives().conditional('type', { is: 3, then: Joi.number().required() }),
debit: Joi.alternatives().conditional('type', { is: 3, then: Joi.number().required() }),
}))
Это работало отлично, как и ожидалось.
Когда значение типа 1
, объект должен иметь только type
, firstname
и lastname
Когда значение типа 2
, объект должен иметь только type
, salary
и pension
Когда значение типа is 3
объект должен иметь только type
, credit
и debit
Любая другая комбинация будет выброшена как ошибка со слоя промежуточного программного обеспечения валидатора joi. Также любое другое значение типа, кроме 1, 2 и 3, будет выдавать ошибку.