При интеграции схем валидации с формами через Yup и резолвер @hookform/resolvers/yup формируется единый формат ошибок, который затем интерпретируется React Hook Form. Основу составляет объект ошибки, возвращаемый механизмом валидации схемы.
Внутренняя ошибка валидации в Yup представлена классом
ValidationError. После обработки через YupResolver она
приводится к структуре, понятной менеджеру формы.
Ключевые поля:
"ValidationError"abortEarly: false)Пример базовой структуры:
{
name: "ValidationError",
message: "Некорректное значение",
path: "email",
type: "email",
inner: []
}
innerПри отключённом abortEarly, Yup продолжает проверку всех
правил и собирает полный список нарушений.
inner: [
{
path: "password",
message: "Слишком короткий пароль",
type: "min"
},
{
path: "password",
message: "Пароль должен содержать цифру",
type: "matches"
}
]
Особенность обработки:
pathformState.errorsReact Hook Form ожидает объект вида:
{
fieldName: {
type: string,
message: string
}
}
YupResolver выполняет трансформацию:
ValidationErrorinner или использует одиночную ошибкуpathYup имеет встроенные дефолтные сообщения, которые появляются при отсутствии кастомизации.
required → “this field is required”min → “this field must be at least X characters”max → “this field must be at most X characters”email → “this field must be a valid email”min → “this field must be greater than or equal to
X”max → “this field must be less than or equal to X”integer → “this field must be an integer”oneOf → “this field must be one of the following
values”notOneOf → “this field must not be one of the following
values”При использовании @hookform/resolvers/yup сообщения проходят без модификации, если не задано переопределение через схему.
const schema = yup.object({
email: yup.string().email().required()
});
При отсутствии кастомных сообщений:
email: "this field is a valid email"
Yup позволяет переопределять сообщения на уровне каждого правила.
const schema = yup.object({
email: yup
.string()
.email("Некорректный формат email")
.required("Email обязателен")
});
Результат ошибки:
{
path: "email",
message: "Некорректный формат email",
type: "email"
}
Yup поддерживает замену стандартных сообщений через
setLocale.
import * as yup from "yup";
yup.setLocale({
mixed: {
required: "Поле обязательно"
},
string: {
min: "Минимальная длина ${min} символов",
email: "Неверный email формат"
}
});
После применения:
path и его влияние на ошибкиПоле path определяет точку привязки ошибки в форме.
Примеры:
| Yup path | React Hook Form поле |
|---|---|
email |
|
user.name |
user.name |
items[0].title |
items.0.title |
YupResolver нормализует индексированные пути для корректной интеграции.
При работе с вложенными структурами формируется иерархия
path.
const schema = yup.object({
user: yup.object({
profile: yup.object({
age: yup.number().min(18)
})
})
});
Ошибка:
{
path: "user.profile.age",
message: "this field must be greater than or equal to 18",
type: "min"
}
abortEarly и стандартные сообщенияПараметр abortEarly влияет на структуру ошибок:
inner пустойinneryupResolver(schema, { abortEarly: false });
При комбинации нескольких валидаторов порядок влияет на итоговое сообщение:
yup.string()
.required("Обязательно")
.min(5, "Слишком короткое")
.max(10, "Слишком длинное")
Если значение пустое:
requiredЭто связано с приоритетом Yup: базовые проверки выполняются раньше ограничений длины.
Yup автоматически приводит типы, но при несоответствии генерирует стандартные сообщения:
"this field must be anumbertype, but the final value was: NaN"В резолвере такие ошибки не изменяются и передаются как есть.
transform
на сообщенияФункция transform может изменить входные данные до
валидации:
yup.string().transform(value => value.trim())
Особенности:
path сохраняется исходныйtest)При использовании пользовательских проверок:
yup.string().test(
"check-uppercase",
"Должно содержать заглавную букву",
value => /[A-Z]/.test(value)
);
Стандартное сообщение заменяется вторым аргументом
test.
Алгоритм формирования сообщения:
ValidationErrorinnerpathРезультат всегда сохраняет исходный текст ошибки, без дополнительной интерпретации.
Если сообщение не задано:
Пример:
yup.string().email()
→ стандартное сообщение библиотеки
React Hook Form ожидает стабильный формат:
errors.email.message
errors.email.type
YupResolver гарантирует:
ValidationError в финальном
объектеarray) и стандартные сообщенияДля массивов используются отдельные правила:
minmaxrequiredПример:
yup.array().min(1, "Добавьте хотя бы один элемент")
Ошибка:
{
path: "items",
message: "Добавьте хотя бы один элемент",
type: "min"
}
Если Yup возвращает нестандартную ошибку:
type может отсутствоватьФинальная структура, передаваемая в форму:
{
fieldName: {
type: "required" | "min" | "custom",
message: "локализованное или дефолтное сообщение",
ref: undefined
}
}
Эта модель остаётся стабильной независимо от сложности схемы, вложенности объектов и количества правил валидации.