Библиотека Superstruct строится вокруг концепции структур (structs), каждая из которых представляет собой неизменяемое описание правила валидации данных. Любая схема — это объект, содержащий не только логику проверки, но и метаинформацию, которую можно анализировать.
Внутри каждая структура содержит несколько ключевых элементов:
Именно наличие этой информации делает возможной инспекцию схем без выполнения самой валидации.
Основной механизм получения человекочитаемого описания структуры —
функция describe.
Она преобразует любую структуру в строковое представление, отражающее её форму.
import { string, number, array, object, describe } from 'superstruct'
const User = object({
name: string(),
age: number(),
tags: array(string()),
})
console.log(describe(User))
Результат будет примерно таким:
{ name: string, age: number, tags: array(string) }
Функция describe полезна в случаях, когда
необходимо:
Каждая структура в Superstruct является объектом с набором скрытых полей, среди которых:
type — тип структуры (например, “string”,
“object”)schema — вложенная схема (особенно для object и
array)refiners — дополнительные проверкиcoercers — функции преобразования входных данныхПример инспекции:
import { object, string } from 'superstruct'
const Person = object({
firstName: string(),
lastName: string(),
})
console.log(Person.type)
console.log(Person.schema)
Поле schema особенно важно: оно позволяет рекурсивно
анализировать структуру.
Инспекция становится мощной, когда применяется к вложенным структурам. Почти все сложные схемы в Superstruct являются деревьями.
Пример обхода:
function inspect(struct, depth = 0) {
const indent = ' '.repeat(depth)
console.log(indent + struct.type)
if (struct.schema && typeof struct.schema === 'object') {
for (const key in struct.schema) {
inspect(struct.schema[key], depth + 1)
}
}
}
Использование:
inspect(Person)
Такой подход позволяет:
Объектные структуры содержат карту полей, каждое из которых является отдельной структурой.
const User = object({
id: string(),
profile: object({
age: number(),
email: string(),
}),
})
Инспекция позволяет извлечь:
Массивы в Superstruct хранят одну внутреннюю структуру элемента.
import { array, number } from 'superstruct'
const Numbers = array(number())
Инспекция:
console.log(Numbers.schema)
Обычно возвращает структуру элемента массива, что позволяет:
Union содержит несколько альтернативных схем.
import { union, string, number } from 'superstruct'
const Value = union([string(), number()])
Инспекция union показывает список возможных веток:
Value.schema
Рекурсивный обход позволяет выявить:
Intersection объединяет несколько структур в одну.
import { intersection, object, string } from 'superstruct'
const A = object({ name: string() })
const B = object({ email: string() })
const C = intersection([A, B])
Инспекция intersection полезна для анализа:
Пользовательские структуры создаются через define.
import { define } from 'superstruct'
const PositiveNumber = define('PositiveNumber', (value) => {
return typeof value === 'number' && value > 0
})
Инспекция таких структур ограничена:
schemaconsole.log(PositiveNumber.type)
Это важно учитывать при генерации документации: пользовательские структуры часто требуют отдельного описания.
Инспекция схем применяется не только для отладки, но и для построения систем вокруг валидации:
Пример генерации простого описания:
function toSchema(struct) {
if (struct.type === 'object') {
const result = {}
for (const key in struct.schema) {
result[key] = toSchema(struct.schema[key])
}
return result
}
if (struct.type === 'array') {
return [toSchema(struct.schema)]
}
return struct.type
}
Сложные схемы часто состоят из комбинаций базовых примитивов. Инспекция позволяет восстановить исходную композицию.
Пример:
const Complex = object({
id: string(),
data: array(union([string(), number()])),
})
При обходе структуры важно учитывать:
Рекурсивный анализ строит дерево:
object
id → string
data → array
union
Несмотря на доступность метаданных, инспекция в Superstruct имеет ограничения:
schemaЭти ограничения требуют учитывать инспекцию как вспомогательный, а не основной инструмент анализа.
При работе с крупными схемами полезно комбинировать:
describe для быстрой визуализацииschema для точного анализаtype для определения узла дереваТипичный процесс анализа:
Такой подход превращает схемы Superstruct в полноценную описательную модель данных, пригодную для автоматической обработки.