Булевы значения: boolean()

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

Назначение boolean()

Схема Joi.boolean() предназначена для проверки значений, которые должны быть логическими. Основная задача — гарантировать, что входные данные представляют собой корректное булево значение или могут быть приведены к нему по заданным правилам.

Базовая форма:

Joi.boolean()

В этом виде допускаются стандартные булевы значения true и false, а также значения, которые библиотека может интерпретировать как логические.


Базовое поведение и приведение типов

По умолчанию схема boolean() выполняет приведение типов (coercion). Это означает, что входные данные могут автоматически преобразовываться в логические значения.

Примеры типичного поведения:

Joi.boolean().validate(true)      // true
Joi.boolean().validate(false)     // false
Joi.boolean().validate('true')    // true
Joi.boolean().validate('false')   // false
Joi.boolean().validate(1)         // true
Joi.boolean().validate(0)         // false

Такое поведение делает схему удобной для обработки данных из HTTP-запросов, где булевы значения часто приходят в виде строк.


Строгое логическое значение (strict)

Режим строгой проверки отключает приведение типов. В этом случае допустимы только реальные булевы значения JavaScript.

Joi.boolean().strict()

Поведение:

Joi.boolean().strict().validate(true)   // true
Joi.boolean().strict().validate('true') // ошибка
Joi.boolean().strict().validate(1)      // ошибка

Строгий режим используется в системах, где критична типовая целостность данных, например при работе с внутренними сервисами или конфигурациями.


Допустимые значения и преобразование

По умолчанию библиотека использует встроенные правила преобразования:

  • truetrue
  • falsefalse
  • "true"true
  • "false"false
  • 1true
  • 0false

Дополнительно можно расширить набор значений через truthy() и falsy().


truthy() и falsy() кастомизация

Методы truthy() и falsy() позволяют определить собственные правила интерпретации значений.

truthy()

Joi.boolean().truthy('yes', 'on', 1)

Теперь значения:

  • "yes"true
  • "on"true
  • 1true

falsy()

Joi.boolean().falsy('no', 'off', 0)

Теперь значения:

  • "no"false
  • "off"false
  • 0false

Комбинация этих методов используется для обработки нестандартных API или форм ввода, где логика представлена текстовыми маркерами.


Обязательность значения

Булево поле может быть обязательным или опциональным.

Joi.boolean().required()

или

Joi.boolean().optional()

Поведение:

  • required() — значение должно присутствовать
  • optional() — значение может отсутствовать

Отсутствие значения при required() приводит к ошибке валидации.


Значения по умолчанию

Для булевых схем часто задаются значения по умолчанию:

Joi.boolean().default(false)

Если значение отсутствует, оно автоматически заменяется на false.

Пример:

Joi.boolean().default(true)

При отсутствии входного значения результат будет true.


Ошибки и сообщения

При несоответствии типу возникает ошибка валидации. Типичные случаи:

  • передана строка без правил преобразования
  • значение не входит в truthy / falsy
  • строгий режим и не-boolean значение

Пример кастомизации сообщений:

Joi.boolean().messages({
  'boolean.base': 'Значение должно быть логическим'
})

Практические сценарии использования

Флаги конфигурации

Булевы значения часто применяются в конфигурационных объектах:

const schema = Joi.object({
  debug: Joi.boolean().default(false),
  cache: Joi.boolean().default(true)
})

API параметры

При обработке запросов:

const schema = Joi.object({
  isActive: Joi.boolean(),
  isAdmin: Joi.boolean()
})

Значения могут приходить как строки:

  • "true"
  • "false"
  • 1
  • 0

Валидация пользовательских форм

В формах булевы значения часто представлены чекбоксами:

const schema = Joi.object({
  agreeTerms: Joi.boolean().valid(true).required()
})

Такое ограничение гарантирует, что пользователь подтвердил действие.


Работа с расширенными правилами интерпретации

При интеграции с внешними системами полезно расширять допустимые значения:

const schema = Joi.boolean()
  .truthy('Y', 'yes')
  .falsy('N', 'no')

Это позволяет унифицировать данные, поступающие из различных источников.


Частые особенности и нюансы

Булевый тип в Joi обладает рядом особенностей, которые важно учитывать:

  • Приведение типов включено по умолчанию
  • Строгий режим полностью отключает преобразование
  • Нестандартные строки не интерпретируются без truthy/falsy
  • Значение null не считается булевым без дополнительной настройки
  • Поведение может зависеть от цепочки методов схемы

Использование boolean() становится предсказуемым только при явном определении правил преобразования, особенно в системах с неоднородными источниками данных.