Boolean

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

Основная идея булевой структуры заключается в формализации логических значений валидации, что делает её ключевым элементом при построении схем данных.


Создание булевой структуры

Базовое определение булевого типа в Superstruct осуществляется с помощью функции boolean():

import { boolean } from 'superstruct'

const IsActive = boolean()

Такое определение создаёт структуру, которая принимает только строго типизированные булевы значения:

  • true
  • false

Любое отклонение от этих значений приводит к ошибке валидации.


Принцип работы валидации

Булевая структура выполняет строгую проверку типа через оператор typeof. Внутренне логика эквивалентна следующему поведению:

typeof value === 'boolean'

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

IsActive(true)   // проходит
IsActive(false)  // проходит

IsActive(1)      // ошибка
IsActive('true')  // ошибка
IsActive(null)    // ошибка

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


Использование в объектах

Булевые структуры часто применяются внутри сложных объектов для описания состояний:

import { object, boolean, string } from 'superstruct'

const UserStatus = object({
  name: string(),
  isActive: boolean(),
  isAdmin: boolean()
})

При валидации объекта каждое поле проверяется независимо, а нарушение типа в любом из них приводит к общей ошибке структуры.


Совместимость с преобразованием данных

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

import { boolean, coerce } from 'superstruct'

const BooleanFromString = coerce(boolean(), string(), (value) => {
  if (value === 'true') return true
  if (value === 'false') return false
  return value
})

Подобная конструкция позволяет явно контролировать допустимые преобразования без нарушения строгой типизации.


Расширение логики через refine

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

import { boolean, refine } from 'superstruct'

const MustBeTrue = refine(boolean(), 'MustBeTrue', (value) => {
  return value === true
})

Такая структура принимает только true, отбрасывая false, несмотря на формальную принадлежность к булевому типу.


Использование в бизнес-логике

Булевые структуры часто выступают в роли флагов состояния:

  • включение/выключение функций
  • разрешения доступа
  • статус выполнения операций
  • маркеры валидности данных

Пример модели конфигурации:

const FeatureFlags = object({
  darkMode: boolean(),
  betaAccess: boolean(),
  notificationsEnabled: boolean(),
  maintenanceMode: boolean()
})

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


Поведение при вложенных структурах

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

import { array, object, boolean } from 'superstruct'

const Permissions = array(boolean())

const Role = object({
  name: string(),
  permissions: Permissions
})

Каждый элемент массива отдельно проверяется на принадлежность к булевому типу.


Ошибки валидации

При несоответствии типов формируется структурированная ошибка, содержащая информацию о пути и причине сбоя:

IsActive('yes')
// StructError:
// Expected a boolean, received string

Такая модель ошибок позволяет точно локализовать проблему в данных.


Производительность и внутренняя модель

Булевая структура является одной из наиболее дешёвых по вычислительной стоимости. Проверка ограничивается одной операцией typeof, без необходимости рекурсивного обхода или сложных вычислений. Это делает её оптимальной для массовой валидации данных в высоконагруженных системах.


Комбинирование с другими структурами

Булевый тип часто используется совместно с другими примитивами для формирования комплексных схем:

import { object, boolean, number, string } from 'superstruct'

const Session = object({
  userId: string(),
  expiresIn: number(),
  isLoggedIn: boolean(),
  isExpired: boolean()
})

Такая комбинация обеспечивает строгую типизацию состояния с минимальной неоднозначностью.


Особенности строгой модели данных

Булевая структура в Superstruct не выполняет неявных преобразований по умолчанию. Это означает:

  • строки "true" и "false" не считаются валидными
  • числа 0 и 1 не интерпретируются как логические значения
  • пустые значения не приводятся автоматически к false

Такой подход обеспечивает детерминированное поведение валидации и исключает скрытые ошибки, возникающие из-за неявного приведения типов в JavaScript.