В схемах валидации Yup мета-информация выступает дополнительным слоем описания структуры данных, который не влияет напрямую на результат проверки, но существенно расширяет возможности интеграции схем в формы, генераторы интерфейсов, документацию и динамические системы обработки данных.
Сама по себе схема Yup описывает правила валидации: тип значения, ограничения, зависимости между полями. Однако в реальных приложениях этого недостаточно. Часто требуется сопровождать схему дополнительными данными:
Мета-информация в Yup позволяет встроить эти данные непосредственно в схему, сохраняя единый источник правды.
Одним из основных механизмов добавления семантики является метод
label.
import * as Yup from 'yup';
const schema = Yup.object({
firstName: Yup.string().label('Имя пользователя').required(),
});
Метод label не влияет на проверку, но используется в
сообщениях об ошибках:
firstName is a required fieldИмя пользователя is a required fieldТаким образом label становится базовой формой
человекочитаемой мета-информации, привязанной к полю.
Более гибкий механизм — метод meta, позволяющий
прикреплять произвольные данные к любому узлу схемы.
const schema = Yup.object({
email: Yup.string()
.email()
.required()
.meta({
icon: 'mail',
group: 'auth',
autocomplete: 'email',
}),
});
В отличие от label, meta не
интерпретируется библиотекой в процессе валидации. Его назначение —
хранение вспомогательных данных.
Типичные сценарии использования:
Мета-данные сохраняются внутри описания схемы и доступны при интроспекции.
Механизм describe позволяет получить структурированное
описание схемы, включая тесты, типы и мета-информацию.
const schema = Yup.string()
.required()
.label('Логин')
.meta({ field: 'username' });
const description = schema.describe();
Результат содержит:
Формат описания используется для:
Мета-информация может применяться не только к примитивам, но и к составным структурам.
const schema = Yup.object({
profile: Yup.object({
age: Yup.number().min(18).meta({
visible: true,
}),
}).meta({
section: 'personal',
}),
});
Здесь формируется иерархия метаданных:
profile есть собственная
мета-информация;age — собственный набор расширений.Такая структура особенно важна при:
Помимо статических метаданных, Yup поддерживает контекст
(context), который передаётся при выполнении валидации и
может влиять на поведение схемы.
schema.validate(data, {
context: {
role: 'admin',
mode: 'strict',
},
});
Внутри кастомных проверок этот контекст доступен через
this.options.context.
Yup.string().test('role-check', function (value) {
const { role } = this.options.context || {};
if (role !== 'admin') {
return value !== 'forbidden';
}
return true;
});
Контекст не сохраняется в схеме, но выполняет роль временной мета-информации, влияющей на логику валидации.
Сообщения об ошибках также являются частью мета-слоя, описывающего поведение схемы при нарушении правил.
Yup.string()
.min(5, 'Слишком короткое значение')
.required('Поле обязательно для заполнения');
Каждое правило может иметь собственное сообщение, формируя семантически насыщенную обратную связь.
Дополнительно сообщения могут зависеть от label,
создавая комбинированную систему:
При увеличении сложности схем Yup мета-слой становится критическим элементом архитектуры. Он позволяет отделить:
Схема начинает выполнять сразу несколько ролей:
Такое разделение особенно важно при использовании схем в:
Мета-информация в Yup не участвует в процессе проверки и не влияет на результат валидации. Это принципиальное архитектурное решение.
Ключевые особенности:
transform);describe.Это делает их безопасным механизмом расширения, не нарушающим предсказуемость валидации.
На практике эти механизмы используются совместно:
const schema = Yup.object({
password: Yup.string()
.label('Пароль')
.required('Введите пароль')
.min(8, 'Минимум 8 символов')
.meta({
strength: 'medium',
showMeter: true,
}),
});
Здесь формируется многослойная структура:
label определяет семантику;meta описывает UI-аспекты;Такое разделение позволяет использовать одну и ту же схему в разных слоях приложения без дублирования логики.