Метод validate является центральным механизмом проверки
данных в библиотеке Yup. Он используется для синхронной и асинхронной
валидации значения относительно схемы и возвращает либо валидированные
данные, либо ошибку типа ValidationError.
schema.validate(value, options?)
Метод вызывается на экземпляре схемы и принимает два параметра:
value — проверяемое значениеoptions — объект конфигурации (необязательный)Возвращаемое значение:
Promise<validValue> при успешной валидацииPromise.reject(ValidationError) при ошибкеТаким образом, метод всегда работает в асинхронном стиле, даже если в схеме нет асинхронных правил.
value представляет собой входные данные, которые
необходимо проверить. Это может быть любой тип:
null или undefinedТип значения не ограничивается схемой на уровне JavaScript — именно схема определяет допустимость структуры и содержимого.
Пример:
const schema = yup.string().min(3);
schema.validate("abc");
В данном случае строка проходит проверку, так как удовлетворяет минимальной длине.
Объект options управляет поведением валидации. Он
позволяет тонко настраивать процесс проверки, трансформации и обработки
ошибок.
abortEarly: boolean
Определяет, прекращать ли проверку после первой ошибки.
true (по умолчанию): возвращается только первая
ошибкаfalse: собираются все ошибкиПример:
schema.validate("a", { abortEarly: false });
При сложной схеме с несколькими ограничениями это позволяет получить полный список нарушений.
context: any
Позволяет передавать дополнительный контекст в схему. Используется в
функциях when, test и других динамических
проверках.
Пример:
const schema = yup.string().when('$role', {
is: 'admin',
then: (s) => s.required()
});
schema.validate("value", { context: { role: 'admin' } });
Контекст доступен внутри схемы через $-ссылки.
strict: boolean
Отключает трансформации данных.
false (по умолчанию): Yup применяет cast и
преобразованияtrue: проверка происходит без преобразованияПример:
const schema = yup.number();
schema.validate("123", { strict: true });
В строгом режиме строка "123" не будет преобразована в
число.
stripUnknown: boolean
Применяется только для объектов. Удаляет поля, не описанные в схеме.
Пример:
const schema = yup.object({
name: yup.string()
});
schema.validate(
{ name: "Alex", age: 25 },
{ stripUnknown: true }
);
Результат:
{ name: "Alex" }
recursive: boolean
Определяет, будет ли выполняться рекурсивная валидация вложенных схем.
true (по умолчанию): проверяются вложенные объекты и
массивыfalse: вложенные схемы игнорируютсяНекоторые версии Yup поддерживают расширенные опции:
path — указывает путь в объекте для точечной
валидацииoriginalValue — исходное значение до трансформацииparent — родительский объект (в сложных схемах)Метод выполняет несколько этапов:
Если strict: false, значение преобразуется к ожидаемому
типу схемы.
Применяются функции .transform(), заданные в схеме.
Выполняются:
required, min,
max)test()При нарушении условий создаётся объект ValidationError,
содержащий:
message — текст ошибкиpath — путь к полюerrors — массив сообщений (если
abortEarly: false)Метод всегда возвращает Promise, даже если внутри нет
асинхронных операций.
await schema.validate(value);
Это важно для унифицированного API, позволяющего использовать одинаковый подход для всех схем.
При ошибке метод отклоняет Promise с объектом:
{
name: "ValidationError",
message: "...",
errors: ["..."],
path: "fieldName"
}
Пример обработки:
schema.validate(data)
.catch(err => {
console.log(err.errors);
});
Метод validate отличается от isValid:
validate возвращает либо данные, либо ошибкуisValid возвращает true или
falseawait schema.isValid(value); // boolean
await schema.validate(value); // value | throws
Хотя существует синхронная версия validateSync, она не
поддерживает асинхронные проверки (например, запросы к серверу или базе
данных). Поэтому validate является универсальным
решением.
При валидации объектов:
stripUnknownПри массивах:
abortEarly: falseПользовательские проверки через test() интегрируются в
pipeline validate.
yup.string().test('check', 'Ошибка', (value) => {
return value === 'ok';
});
Такие проверки участвуют в общей цепочке и могут быть асинхронными.
Внутри пользовательских функций доступен контекст схемы:
this.parent — родительский объектthis.path — путь текущего поляthis.options — опции validateЭто позволяет создавать зависимые проверки между полями.
При abortEarly: true возвращается только первая ошибка,
что ускоряет выполнение.
При abortEarly: false структура ошибки расширяется:
{
errors: ["Ошибка 1", "Ошибка 2", "Ошибка 3"]
}
Это особенно важно для форм с множеством полей.
Метод validate оптимизирован для:
await schema.validate(formData, { abortEarly: false });
await schema.validate(req.body);
await schema.validate(data, {
context: { mode: "edit" }
});