В Superstruct булевый тип представляет собой базовую структурную
единицу, предназначенную для строгой проверки значений, которые должны
принадлежать к типу boolean. Он используется в ситуациях,
где требуется гарантировать, что входные данные являются исключительно
true или false, исключая любые иные типы,
включая строки, числа, null, undefined и
сложные структуры.
Основная идея булевой структуры заключается в формализации логических значений валидации, что делает её ключевым элементом при построении схем данных.
Базовое определение булевого типа в Superstruct осуществляется с
помощью функции boolean():
import { boolean } from 'superstruct'
const IsActive = boolean()
Такое определение создаёт структуру, которая принимает только строго типизированные булевы значения:
truefalseЛюбое отклонение от этих значений приводит к ошибке валидации.
Булевая структура выполняет строгую проверку типа через оператор
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, позволяя накладывать дополнительные условия поверх
базовой структуры.
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.