В библиотеке Yup метод describe() используется для
получения структурированного описания схемы в виде обычного
JavaScript-объекта. Это описание отражает внутреннюю структуру
валидатора без выполнения самой валидации и без необходимости запускать
проверку данных.
Ключевая особенность describe() заключается в том, что
он переводит декларативную схему в формат, удобный для анализа,
сериализации, генерации интерфейсов и динамической работы с формами. При
этом возвращаемая структура не содержит бизнес-логики проверки, а
представляет собой метаданные схемы.
Результат вызова schema.describe() представляет собой
объект со следующими ключевыми компонентами:
string,
number, object, array,
boolean, date, mixed).label()null и отсутствующих значенийЭта структура может быть вложенной, отражая глубину схемы любой сложности.
Для простых типов данных describe() возвращает
компактную структуру, содержащую базовую информацию о валидаторах.
const schema = Yup.string().min(3).max(10).required();
console.log(schema.describe());
Результат включает:
type: "string"tests: min, max,
requiredemail, url, matches)Каждое правило представлено как объект с именем теста и его параметрами.
Для числовых схем фиксируются ограничения диапазона и допустимых значений:
Yup.number().min(0).max(100).integer()
Описание будет содержать:
minmaxintegerpositive, negative при соответствующих
ограниченияхОбъектные схемы формируют древовидную структуру через поле
fields.
const schema = Yup.object({
name: Yup.string().required(),
age: Yup.number().min(18),
});
Результат describe():
type: "object"
fields:
name: описание строковой схемыage: описание числовой схемыКаждое поле объекта описывается независимо, что позволяет строить полноценную мета-модель данных.
Особенность описания объектов заключается в том, что оно сохраняет иерархию без потери контекста вложенности, включая вложенные объекты:
Yup.object({
user: Yup.object({
email: Yup.string().email(),
}),
});
В describe() вложенные уровни представлены рекурсивно
через fields.
Массивы используют поле innerType, которое описывает
структуру элементов.
const schema = Yup.array().of(Yup.number().positive());
Описание включает:
type: "array"
innerType:
type: "number"tests: positiveЕсли массив содержит сложные объекты, innerType
становится вложенной структурой с fields, аналогично
объектам.
При использовании методов вроде when() структура
описания может включать дополнительные зависимости, однако они не всегда
полностью разворачиваются в статическое дерево. Вместо этого фиксируется
факт наличия условной логики.
Схемы различают:
nullable: true — допустимость nulloptional: true — отсутствие значенияЭто важно при генерации форм и API-спецификаций.
Yup.string().oneOf(["admin", "user"])
В описании появляется:
oneOf: ["admin", "user"]Это позволяет использовать схему как источник перечислений.
Один из наиболее распространённых сценариев использования
describe() — построение динамических форм. На основе
структуры схемы можно автоматически создавать:
Тип поля определяется через type, а ограничения через
tests.
Описания схем могут использоваться как промежуточный слой между кодом и документацией. В отличие от ручного описания, они всегда синхронизированы с реальной логикой валидации.
Хотя describe() не выполняет проверку данных, он может
применяться для:
Структура, возвращаемая describe(), может быть
сериализована в JSON и передана в другие системы. Это позволяет:
Несмотря на полезность, describe() имеет ряд
ограничений:
when)Таким образом, describe() следует рассматривать как
инструмент для анализа структуры, а не как полную сериализацию
схемы.
Главная особенность результата заключается в рекурсивности. Любая схема, независимо от сложности, преобразуется в дерево узлов, где каждый узел описывает свой тип и набор правил.
Это делает возможным: