Джой проверки нескольких условий И - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь проверить мой target объект со следующими условиями:

if (target.company === `GP` AND one of target.documents type equals `full`) {
    one of target.documents type must equals `part-should-be-error`
} else {
    throw new Error()
}

В этом примере проверка не возвращает никаких ошибок, но это должно произойти из-за 'part' !== 'part-should-be-error'

Я пытался https://stackoverflow.com/a/53647449/10432429, но он не работает с Joi v15

Поскольку я не могу объединить схему массива с альтернативной схемой, все, что я могу сделать, это использовать $чтобы получить глобальный context, но кажется, что он тоже не работает

У меня есть кодовая база на Joi v15.1.1, поэтому, пожалуйста, установите ту же версию npm i @hapi/joi@15.1.1

const Joi = require('@hapi/joi');

(async () => {
    const target = {
        name: 'Jeff',
        company: 'GP',
        documents: [
            {type: 'full', value: 'apple'},
            {type: 'part', value: 'tesla'},
        ],
    };

    const documents = Joi.object().keys({
        type: Joi.string().valid(['full', 'part', 'empty']),
        value: Joi.string().min(1).max(40)
            .required(),
    }).required();

    const schema = Joi.object()
        .keys({
            name: Joi.string().min(1).max(20)
                .required(),
            company: Joi.string().valid(['GP', 'QW']),
            documents: Joi.array().items(documents).min(1)
                .when('$', {
                    is: Joi.object().keys({
                        company: Joi.string().valid(['GP']),
                        documents: Joi.array().has(Joi.object({type: Joi.string().valid('full')}).unknown().required()),
                    }).unknown().required(),
                    then: Joi.array().has(Joi.object({type: Joi.string().valid(['part-should-be-error'])}).unknown()).required(),
                })
                .required(),
        });

    await Joi.validate(target, schema, {context: target});
})();

Если ясделать что-то странное, пожалуйста, не стесняйтесь показать другой способ, как решить эту проблему

...