YupResolver служит адаптером между схемами валидации
Yup и форм-движком (чаще всего
react-hook-form). Его основная задача — преобразовать
результат валидации Yup в унифицированный формат, который понимает
система форм.
На выходе резолвер формирует объект следующей структуры:
Ключевой момент заключается в том, что именно обработка результата определяет поведение формы после завершения валидации: будет ли отправка данных, какие поля будут помечены ошибками и как отобразятся сообщения.
Yup при неуспешной валидации генерирует объект
ValidationError, содержащий:
message — текст ошибкиpath — путь до поля (например,
user.email)type — тип ошибки (если задан через
test)inner — массив вложенных ошибок (при
abortEarly: false)YupResolver выполняет нормализацию:
ValidationError в плоскую или вложенную
структуруpath с ключами формыПример логики преобразования:
user.email → errors.user.emailitems[0].name → errors.items[0].nameПри стандартной конфигурации Yup (abortEarly: true)
обработка результата упрощается:
inner массив либо пустой, либо не используетсяВ таком режиме YupResolver получает один
ValidationError, который напрямую маппится в
errors.
При отключении раннего прерывания Yup собирает все ошибки за один проход:
inner содержит полный список нарушенийpatherror.innerpathFieldErrorsПри конфликте нескольких ошибок одного поля применяется правило:
values в результате работы YupResolver зависят от
успешности проверки:
Если ошибок нет:
transform,
cast)Если есть ошибки:
поведение зависит от стратегии формы
возможны варианты:
Важно, что YupResolver сам по себе не изменяет бизнес-логику значений — он лишь передаёт результат Yup.
Одной из сложных частей обработки результата является интерпретация путей:
user.emailuser[0].emailitems.0.nameYupResolver приводит их к формату, совместимому с системой полей:
FieldArray)При работе с глубоко вложенными схемами YupResolver формирует рекурсивную структуру ошибок:
Пример:
errors: {
user: {
profile: {
email: {
type: "required",
message: "Email обязателен"
}
}
}
}
Массивы являются отдельным случаем трансформации результата.
items: [
{ name: { message: "Обязательное поле" } },
null,
{ price: { message: "Некорректное значение" } }
]
undefined или
nullВ случаях, когда одно поле генерирует несколько ошибок, применяется стратегия разрешения конфликтов:
innerYupResolver поддерживает асинхронный режим:
validate() возвращает PromiseYup позволяет модифицировать данные через:
transformcastdefaulttransform применяется до финальной валидацииcast влияет на итоговый тип данныхdefault заполняет отсутствующие значенияРезультат в values уже содержит преобразованные данные,
что снижает необходимость постобработки на уровне формы.
Кастомные проверки (test) формируют ошибки с
нестандартными type.
type может быть строкой произвольного форматаmessage может зависеть от контекстаYupResolver не интерпретирует логику теста — он лишь переносит результат.
В некоторых случаях Yup возвращает некорректные или неполные пути:
pathinnerpathpath + messageОбобщённый формат результата:
{
values: {
/* валидированные и трансформированные данные */
},
errors: {
/* нормализованные ошибки по путям формы */
}
}
Именно эта структура используется системой формы для: