Метод validateSync в Yup выполняет синхронную проверку
данных относительно заданной схемы. Его ключевая особенность заключается
в том, что он не возвращает Promise и не требует использования
async/await. Валидация происходит немедленно, в рамках
текущего стека вызовов, а результат либо возвращается сразу, либо
выбрасывается исключение при нарушении правил схемы.
Синхронная валидация в Yup строится на предположении, что все правила проверки могут быть выполнены без обращения к внешним источникам данных. Это означает отсутствие HTTP-запросов, асинхронных вычислений или ожидания сторонних сервисов.
Основная идея:
ValidationError.Такой подход используется в случаях, когда важна максимальная скорость обработки и предсказуемость выполнения.
Метод вызывается непосредственно у схемы:
schema.validateSync(value, options?)
Где:
value — данные, которые необходимо проверить;options — объект конфигурации поведения валидации.Возвращаемое значение:
ValidationError при несоответствии
схемы.import * as Yup from 'yup';
const schema = Yup.string().required().min(3);
const result = schema.validateSync('hello');
В этом примере:
При передаче некорректного значения:
schema.validateSync('');
будет выброшена ошибка, содержащая информацию о первом нарушенном ограничении.
Ошибки, возникающие при синхронной валидации, имеют тип
ValidationError. Они содержат структурированную информацию
о причине сбоя.
try {
schema.validateSync('ab');
} catch (err) {
console.log(err.name); // ValidationError
console.log(err.message); // описание ошибки
}
Полезные свойства ошибки:
message — текстовое описание;path — путь до поля, где произошла ошибка;errors — массив сообщений (в случае нескольких
нарушений).Синхронная валидация активно применяется для объектов, описывающих структуру данных.
const userSchema = Yup.object({
name: Yup.string().required(),
age: Yup.number().min(18)
});
const user = {
name: 'Alex',
age: 25
};
const validated = userSchema.validateSync(user);
Если одно из полей не соответствует правилам, выбрасывается исключение, и выполнение прерывается.
Опция abortEarly управляет тем, останавливается ли
валидация после первой ошибки.
userSchema.validateSync(user, { abortEarly: false });
Поведение:
true (по умолчанию) — проверка прекращается при первой
ошибке;false — собираются все ошибки по всем полям.При abortEarly: false массив errors внутри
исключения содержит все найденные нарушения.
Yup поддерживает проверку массивов через
array().of().
const schema = Yup.array().of(
Yup.number().positive().integer()
);
schema.validateSync([1, 2, 3]);
Если хотя бы один элемент нарушает правило:
schema.validateSync([1, -2, 3]);
будет выброшена ошибка, указывающая на индекс проблемного элемента.
Перед валидацией Yup может приводить значение к нужному типу.
const schema = Yup.number();
schema.validateSync('42'); // вернёт 42 как число
Это поведение зависит от внутреннего механизма кастинга и может быть отключено через опции схемы.
При включении строгого режима отключается автоматическое преобразование типов.
const schema = Yup.number().strict();
schema.validateSync('42'); // ошибка
Теперь значение должно строго соответствовать ожидаемому типу.
Синхронная валидация корректно работает с вложенными объектами любой глубины.
const schema = Yup.object({
profile: Yup.object({
username: Yup.string().required(),
stats: Yup.object({
score: Yup.number().min(0)
})
})
});
schema.validateSync({
profile: {
username: 'user1',
stats: {
score: 10
}
}
});
При ошибке путь будет отражать вложенность, например:
profile.stats.score
validateSync отличается от validate
фундаментально:
validateSync — синхронный, выбрасывает исключение;validate — асинхронный, возвращает Promise.Пример асинхронного аналога:
await schema.validate(value);
Синхронный вариант предпочтителен, когда отсутствуют асинхронные правила и важна минимальная задержка выполнения.
Синхронный режим не поддерживает:
test с Promise);При попытке использовать асинхронные проверки
validateSync либо игнорирует их, либо приводит к ошибке
конфигурации схемы.
Метод transform выполняется до проверки и позволяет
изменять входные данные.
const schema = Yup.number().transform((value) => {
return Number(value);
});
schema.validateSync('10'); // 10
Это часто используется для нормализации входных значений перед строгими проверками.
При вызове метода происходит последовательность шагов:
Такой порядок обеспечивает детерминированность поведения при каждом вызове.
Синхронная валидация применяется в случаях:
Её основное преимущество — отсутствие асинхронного оверхеда и
мгновенное получение результата, что делает validateSync
удобным инструментом для локальных проверок данных внутри
приложения.