Библиотека Yup реализует декларативный подход к валидации данных через схемы. Основная идея заключается в том, что структура данных описывается отдельной схемой, а проверка значений выполняется автоматически на основе заданных правил.
Схема в Yup представляет собой объект, описывающий ожидаемую форму данных: типы полей, ограничения, условия обязательности и дополнительные правила. Такой подход позволяет отделить бизнес-логику от валидации и делает код более предсказуемым.
Ключевая особенность заключается в иммутабельности схем: каждый метод возвращает новую схему, не изменяя исходную.
Yup предоставляет набор примитивных типов, соответствующих основным структурам данных Jav * aScript:
Каждый тип поддерживает собственный набор методов валидации.
Пример базового описания схемы:
import * as Yup from "yup";
const schema = Yup.object({
name: Yup.string(),
age: Yup.number(),
isActive: Yup.boolean()
});
Строковые значения являются одним из наиболее часто используемых типов. Для них доступен широкий набор ограничений.
Основные методы:
required() — обязательное полеmin(n) — минимальная длинаmax(n) — максимальная длинаemail() — проверка email-форматаmatches(regex) — проверка по регулярному выражениюtrim() — удаление пробелов по краямПример:
const schema = Yup.object({
username: Yup.string()
.required()
.min(3)
.max(20)
.matches(/^[a-zA-Z0-9_]+$/)
});
Строковая валидация часто используется для форм регистрации, авторизации и пользовательских профилей.
Числовой тип поддерживает проверку диапазонов и ограничений значений.
Основные методы:
min(n) — минимальное значениеmax(n) — максимальное значениеpositive() — только положительные числаnegative() — только отрицательные числаinteger() — только целые числаПример:
const schema = Yup.object({
price: Yup.number()
.required()
.positive()
.max(1000)
});
Особенность числовой валидации заключается в строгом приведении типов, поэтому строковые значения могут быть преобразованы при необходимости.
Объектная схема позволяет описывать вложенные структуры данных.
const schema = Yup.object({
user: Yup.object({
name: Yup.string().required(),
age: Yup.number().min(18)
})
});
Вложенность поддерживается произвольной глубины, что делает возможной валидацию сложных JSON-структур.
Дополнительно доступны методы:
noUnknown() — запрет лишних полейshape() — описание структуры объектаМассивы в Yup описываются через array() и позволяют
задавать тип элементов.
const schema = Yup.object({
tags: Yup.array()
.of(Yup.string().min(2))
.min(1)
.max(10)
});
Основные методы:
of(schema) — схема элементовmin(n) — минимальное количество элементовmax(n) — максимальное количество элементовcompact() — фильтрация значенийМассивная валидация часто применяется в тегах, списках идентификаторов и динамических формах.
По умолчанию поля считаются необязательными. Для явного указания
используется required().
Yup.string().required()
Методы:
required() — обязательное полеnullable() — допускается nulldefault(value) — значение по умолчаниюconst schema = Yup.object({
description: Yup.string().nullable().default("нет описания")
});
Гибкость Yup достигается через метод test(), позволяющий
задавать собственные правила.
const schema = Yup.object({
password: Yup.string().test(
"strong-password",
"Слабый пароль",
value => /[A-Z]/.test(value) && /\d/.test(value)
)
});
test() принимает:
Это позволяет реализовать любые бизнес-правила, не ограничиваясь стандартными методами.
Yup поддерживает асинхронные проверки, например обращение к серверу.
const schema = Yup.object({
email: Yup.string().test(
"check-email",
"Email занят",
async (value) => {
const response = await fetch(`/api/check?email=${value}`);
const data = await response.json();
return data.available;
}
)
});
Асинхронная валидация особенно важна для проверки уникальности данных.
Схемы поддерживают предварительную обработку значений через
transform().
Yup.string().transform(value => value.trim())
Использование трансформаций позволяет нормализовать данные до проверки.
Примеры:
Метод when() позволяет задавать зависимости между
полями.
const schema = Yup.object({
isCompany: Yup.boolean(),
companyName: Yup.string().when("isCompany", {
is: true,
then: schema => schema.required()
})
});
Это ключевой механизм для динамических форм.
Ошибки валидации представляют собой структурированные объекты, содержащие:
schema.validate(data)
.catch(err => console.log(err.errors));
Метод validate() возвращает промис, что позволяет
интегрировать библиотеку в асинхронные потоки данных.
Основные методы выполнения проверки:
validate() — полная проверка объектаvalidateSync() — синхронная версияisValid() — проверка без выбрасывания ошибокcast() — приведение типовconst result = await schema.isValid(data);
Yup умеет преобразовывать входные данные в нужный формат.
Yup.number().cast("42") // 42
Это особенно полезно при работе с формами, где все значения приходят как строки.
Схемы часто используются в связке с формами и библиотеками управления состоянием.
Основные сценарии:
Схемы позволяют централизовать правила и избегать дублирования логики.
Подход Yup основан на композиции:
Это делает систему расширяемой и предсказуемой при росте сложности приложения.