Joi: How to validate all items in array have the same type

Viewed 280

My array can have multiple types:

[Joi.string(), Joi.number(), Joi.boolean(), Joi.array(), Joi.object()]

But I want to allow only one of them in the same time.

I tried the following:

attributes: Joi.object().pattern(/\w+/, Joi.alternatives().try([Joi.array().items(Joi.string()), Joi.array().items(Joi.number()), Joi.array().items(Joi.boolean()), Joi.array().items(Joi.array()), Joi.array().items(Joi.object())]))

I'm using Joi 11.4.0. I know it is an old version, but is there any way to perform such a validation? Does it doable in another version?

1 Answers

This works with version 11.4.0 but also the currently newest version 17.2.1

const Joi = require('joi');

const schema = Joi.object({
  attributes: Joi.alternatives().try(
    Joi.array().items(Joi.string()),
    Joi.array().items(Joi.number()),
    Joi.array().items(Joi.boolean()),
    Joi.array().items(Joi.array()),
    Joi.array().items(Joi.object())
  )
  .required(),
})
.required();

const onlyStrings = {
  attributes: ['one', 'two', 'three']
};
console.log(schema.validate(onlyStrings).error);

const onlyNumbers = {
  attributes: [1, 2, 3],
};
console.log(schema.validate(onlyNumbers).error);

const onlyBooleans = {
  attributes: [false, true, false],
};
console.log(schema.validate(onlyBooleans).error);


const onlyArrays = {
  attributes: [[], [], []],
};
console.log(schema.validate(onlyArrays).error);

const onlyObjects = {
  attributes: [{}, {}, {}]
};
console.log(schema.validate(onlyObjects).error);

// fails
const stringAndNumbers = {
  attributes: ['one', 2, 'three']
};
console.log(schema.validate(stringAndNumbers).error);
Related