Синтаксис Joi 'when / is' - как проверить тип?

Я использую библиотеку Joi для проверки объекта. Я хочу сделать определенное свойство обязательным, если другое необязательное свойство (на том же уровне того же объекта) имеет определенный тип, например нить. В документации Joi показан этот пример:

const schema = {
    a: Joi.when('b', { is: true, then: Joi.required() }),
    b: Joi.boolean()
};

Однако вместо того, чтобы проверять, что b (например) истинно, я хотел бы проверить, является ли это строкой. Я пробовал это:

const schema = {
    a: Joi.when('b', { is: Joi.string(), then: Joi.required() }),
};

Но похоже, что это не работает. Если я полностью удалю b из объекта, Джой все равно будет ожидать, что a потребуется. Если b отсутствует в объекте, я не хочу, чтобы в a выполнялась какая-либо проверка.

Я не могу найти других примеров, чтобы люди делали это - может ли кто-нибудь помочь?


person gwpmad    schedule 20.10.2016    source источник


Ответы (1)


Нам удалось решить эту проблему с помощью object.with . Если присутствует один ключ (например, a), то должны присутствовать и его партнеры (например, b).

Однако это не идеально, потому что, хотя мы могли указать, что a должно быть Joi.string (), object.with ищет просто его присутствие, а не его тип. Таким образом, если присутствует нестроковый a, для a будет выдана ошибка «должно быть строкой». Совершенно нормально, что a не является строкой - все это должно означать, что b не является обязательным. Я надеюсь, что в этом есть смысл.

person gwpmad    schedule 21.10.2016