Схема валидации в Yup представляет собой декларативное описание структуры данных и правил, которым эти данные должны соответствовать. Основная идея заключается в том, что каждая схема одновременно описывает тип данных и набор ограничений, применяемых к этому типу.
Схема является иммутабельным объектом: после создания она не изменяется, а все модификации возвращают новую версию схемы.
Yup предоставляет несколько базовых конструкторов схем, соответствующих примитивным типам JavaScript.
import * as Yup from 'yup';
const schema = Yup.string();
Строковая схема описывает значения типа string и
позволяет добавлять ограничения:
const schema = Yup.string()
.min(3)
.max(50)
.required()
.trim();
Ключевые методы:
min(n) — минимальная длина строкиmax(n) — максимальная длинаrequired() — обязательное полеtrim() — автоматическое удаление пробелов по краямemail() — проверка email форматаmatches(regex) — проверка по регулярному выражениюconst schema = Yup.number();
Числовая схема работает только с валидными числами, включая преобразование строк в число при необходимости.
const schema = Yup.number()
.min(0)
.max(100)
.integer()
.required();
Основные методы:
min(n) — минимальное значениеmax(n) — максимальное значениеpositive() — только положительные числаnegative() — только отрицательные числаinteger() — только целые числаmoreThan(n) / lessThan(n) — строгие
границыconst schema = Yup.boolean();
const schema = Yup.boolean().required();
Булева схема обычно используется для чекбоксов и флагов состояния.
const schema = Yup.date();
const schema = Yup.date()
.min(new Date(2000, 0, 1))
.max(new Date())
.required();
Методы:
min(date) — минимальная датаmax(date) — максимальная датаDateОбъектные схемы являются ключевым элементом Yup, поскольку позволяют описывать структуру сложных данных.
const schema = Yup.object({
name: Yup.string().required(),
age: Yup.number().required(),
});
Альтернативный способ через shape:
const schema = Yup.object().shape({
name: Yup.string().required(),
age: Yup.number().required(),
});
const schema = Yup.object({
user: Yup.object({
name: Yup.string().required(),
address: Yup.object({
city: Yup.string().required(),
zip: Yup.string().required(),
}),
}),
});
Каждый уровень структуры описывается отдельной схемой, что обеспечивает модульность и повторное использование.
Схемы массивов описывают коллекции однотипных элементов.
const schema = Yup.array()
.of(Yup.string().required())
.min(1)
.max(10);
Метод .of() задаёт схему элементов массива.
const schema = Yup.array().of(
Yup.object({
id: Yup.number().required(),
title: Yup.string().required(),
})
);
mixed используется для значений, которые не имеют
строгого типа.
const schema = Yup.mixed();
Применяется для:
const schema = Yup.mixed()
.required()
.nullable();
Yup.string().required();
Yup.string().notRequired();
required() означает обязательное значение,
notRequired() снимает обязательность.
Yup.string().nullable();
Позволяет значению быть null.
Yup.string().default('guest');
Устанавливает значение по умолчанию при отсутствии данных.
Yup выполняет автоматическое приведение типов перед валидацией.
Пример:
"123" может быть преобразована в число
123DateYup.number().cast("42"); // 42
Кастинг можно отключить:
schema.validate(data, { strict: true });
Yup позволяет ссылаться на другие поля через ref.
const schema = Yup.object({
password: Yup.string().required(),
confirmPassword: Yup.string().oneOf([Yup.ref('password')]),
});
Yup.ref() создаёт зависимость между значениями внутри
одной схемы.
Условные правила реализуются через when().
const schema = Yup.object({
isCompany: Yup.boolean(),
companyName: Yup.string().when('isCompany', {
is: true,
then: schema => schema.required(),
otherwise: schema => schema.notRequired(),
}),
});
Механизм позволяет динамически изменять правила в зависимости от состояния других полей.
Метод transform() позволяет изменять входные данные до
проверки.
Yup.string().transform(value => value?.trim());
Пример с числом:
Yup.number().transform(value => {
return isNaN(value) ? undefined : value;
});
Валидация в Yup происходит в определённой последовательности:
transform)requiredmin, max,
matches и т.д.)test)Yup.string().test('custom-rule', 'Ошибка', value => {
return value === 'ok';
});
schema.validate(data, { strict: true });
Отключает приведение типов и выполняет проверку «как есть».
schema.validateAt('user.name', data);
Позволяет валидировать отдельное поле внутри сложной структуры.
Метод test() добавляет пользовательскую логику
проверки.
Yup.string().test(
'no-spaces',
'Строка не должна содержать пробелы',
value => !/\s/.test(value)
);
Функция теста получает:
value — текущее значениеcontext — контекст выполненияСхемы можно переиспользовать и комбинировать.
const baseString = Yup.string().min(3).max(20);
const nameSchema = baseString.required();
const nicknameSchema = baseString.notRequired();
Композиция позволяет строить единые правила для разных частей приложения без дублирования логики.