При использовании YupResolver сообщения об ошибках формируются на основе результатов валидации схемы и преобразуются в структуру, совместимую с механизмом обработки ошибок в формах. Основной принцип заключается в том, что каждая ошибка из схемы Yup становится частью объекта ошибок, где ключ соответствует пути поля, а значение содержит текстовое сообщение.
Типичная структура ошибки выглядит как:
message — человекочитаемый текстtype — тип нарушения правила (required, min, matches и
т.д.)path — путь к полю в объекте данныхПри этом YupResolver преобразует внутренний формат Yup в формат, ожидаемый библиотекой управления формами, сохраняя при этом семантику вложенных полей.
YupResolver выступает промежуточным слоем между схемой валидации и UI-слоем. Его задача — не только передать ошибки, но и корректно привести их к структуре, удобной для отображения.
Основные этапы преобразования:
abortEarly)Ключевой момент — сохранение соответствия между вложенной структурой данных и плоским представлением ошибок.
Сообщения могут задаваться непосредственно в схеме Yup. Именно этот уровень чаще всего определяет финальный текст, который увидит пользователь.
Пример:
import * as yup from "yup";
const schema = yup.object({
email: yup
.string()
.required("Поле email обязательно для заполнения")
.email("Некорректный формат email"),
age: yup
.number()
.min(18, "Минимальный возраст — 18 лет")
});
YupResolver не изменяет текст сообщений, а лишь транспортирует их в форму. Это означает, что вся логика формулировки сообщений должна быть заложена в схеме.
Форматирование сообщений часто связано с необходимостью поддержки нескольких языков. В этом случае Yup позволяет задавать сообщения через функции или внешние словари.
Распространённый подход — использование фабрики сообщений:
const messages = {
required: "Обязательное поле",
email: "Неверный email",
min: (min) => `Минимальное значение: ${min}`
};
const schema = yup.object({
username: yup.string().required(messages.required),
email: yup.string().required(messages.required).email(messages.email),
age: yup.number().min(18, messages.min(18))
});
YupResolver не занимается интернационализацией, но корректно сохраняет уже локализованные строки без дополнительной обработки.
При работе с вложенными объектами ключевым аспектом становится сохранение пути ошибки. Например:
const schema = yup.object({
profile: yup.object({
firstName: yup.string().required("Имя обязательно"),
lastName: yup.string().required("Фамилия обязательна")
})
});
После валидации YupResolver формирует структуру:
profile.firstNameprofile.lastNameТакой формат позволяет UI-компонентам напрямую связывать сообщение с конкретным полем, не выполняя дополнительного парсинга.
Особое внимание требуется при работе с массивами. Yup возвращает ошибки с индексированными путями:
const schema = yup.object({
users: yup.array().of(
yup.object({
name: yup.string().required("Имя обязательно")
})
)
});
Результат валидации:
users[0].nameusers[1].nameYupResolver сохраняет индексную структуру без преобразования в альтернативные форматы, что позволяет UI корректно отображать ошибки внутри динамических списков.
Сообщения могут быть как общими, так и специфичными для конкретного правила. В Yup каждая проверка может иметь собственный текст, что позволяет формировать многоуровневую систему сообщений.
Пример различий:
"Обязательное поле" — базовое сообщение required"Минимум 8 символов" — сообщение для min"Пароль слишком простой" — кастомная логика
matchesYupResolver не агрегирует сообщения, если включён режим детальной валидации. В результате каждое правило может возвращать отдельное сообщение для одного поля.
Поведение формирования сообщений зависит от параметра
abortEarly в Yup:
abortEarly: true — возвращается первая найденная
ошибкаabortEarly: false — возвращаются все ошибки поляYupResolver учитывает этот режим и формирует объект ошибок соответственно. При отключённом раннем завершении сообщения могут быть агрегированы в массив или объединены в зависимости от внутренней реализации формы.
Иногда требуется преобразовать сообщение перед отображением. Это может быть полезно для:
Типичный подход — постобработка на уровне формы:
const formatMessage = (message) => `[Ошибка] ${message}`;
Однако YupResolver не предоставляет встроенного механизма форматирования текста сообщений, оставляя этот слой внешней логике.
Финальная цель форматирования — корректное отображение в интерфейсе. Обычно UI ожидает структуру:
или
YupResolver обеспечивает совместимость с этой моделью, преобразуя результат Yup в объект, где каждый путь соответствует конкретному элементу формы.
Если сообщение не задано явно в схеме, Yup использует внутренние дефолтные строки. Эти строки зависят от типа ошибки и версии библиотеки.
YupResolver не заменяет и не локализует такие сообщения, поэтому их внешний вид может отличаться от кастомных строк, заданных разработчиком.
При проектировании сообщений важно соблюдать единый стиль формулировок:
YupResolver не вмешивается в стиль сообщений, но неконсистентность становится заметной на уровне UI, поскольку все сообщения отображаются в едином контексте формы без дополнительной обработки.
В связке с системами управления формами сообщения используются напрямую из объекта ошибок. Типичный сценарий отображения:
YupResolver гарантирует, что сообщение остаётся синхронизированным с состоянием формы, обновляясь при каждой повторной валидации без ручного вмешательства.