Валидационная библиотека Yup предоставляет декларативный способ
описания правил проверки данных. Одним из базовых и наиболее часто
используемых механизмов является установка обязательности поля через
метод required().
Этот метод задаёт правило, при котором значение поля не может быть
undefined, null или пустым (в зависимости от
типа данных и дополнительных настроек). Его использование формирует
фундамент строгой валидации форм и входных данных.
Метод required() применяется к любому типу схемы:
строкам, числам, массивам, объектам и другим типам, поддерживаемым
Yup.
Основная идея:
Простейший пример:
import * as Yup from 'yup';
const schema = Yup.object({
name: Yup.string().required('Имя обязательно для заполнения')
});
В этом случае поле name обязано содержать строку. Если
оно отсутствует или равно пустому значению (в зависимости от контекста
формы), валидация завершится ошибкой.
Для строк required() проверяет наличие непустого
значения:
Yup.string().required()
Особенность заключается в том, что пустая строка "" по
умолчанию считается допустимой, если не используется дополнительная
настройка:
Yup.string().trim().required('Поле не может быть пустым')
Метод trim() часто используется совместно с
required() для исключения строк, состоящих из пробелов.
Для числовых значений:
Yup.number().required()
Здесь required() проверяет, что значение не
undefined и не null. Значение 0
считается валидным, так как является корректным числом.
Частая ошибка — попытка трактовать 0 как “пустое
значение”, однако Yup рассматривает его как допустимое.
Yup.boolean().required()
Булево поле считается обязательным, но важно понимать:
false является валидным значением и не воспринимается как
отсутствие данных.
Yup.array().required()
Проверяется наличие самого массива. Однако пустой массив
[] считается допустимым значением, так как он
существует.
Для проверки непустого массива комбинируются дополнительные методы:
Yup.array()
.min(1, 'Добавьте хотя бы один элемент')
.required()
Yup.object().required()
Проверяется наличие объекта как значения. При этом пустой объект
{} остаётся валидным, если не добавлены дополнительные
ограничения:
Yup.object()
.shape({
email: Yup.string().required()
})
.required()
Метод required() принимает строку с сообщением об
ошибке:
Yup.string().required('Это поле обязательно')
Также возможно использование функций для динамических сообщений:
Yup.string().required(({ path }) => `Поле ${path} обязательно`)
Это позволяет формировать контекстные ошибки на основе структуры схемы.
Yup.string().trim().required()
Удаляет пробелы по краям строки перед проверкой. Это предотвращает ситуацию, когда поле визуально заполнено, но фактически содержит только пробелы.
Yup.string().nullable().required()
Метод nullable() позволяет значению быть
null, но при добавлении required() это
поведение переопределяется. В зависимости от порядка вызовов и версии
Yup, результат может различаться, поэтому логика должна быть строго
определена.
Yup.string().default('guest').required()
Если значение отсутствует, применяется значение по умолчанию. После
применения default() поле фактически перестаёт быть
“пустым”, но required() всё равно участвует в общей схеме
проверки.
0 для чисел не считается пустымfalse для булевых значений не считается пустым[] для массивов не считается пустым{} для объектов не считается пустымYup.string().required().min(1)
Использование required() и min(1) для строк
часто дублирует логику. Однако в некоторых сценариях min(1)
обеспечивает более строгую проверку длины, тогда как
required() отвечает за наличие значения.
Yup.string().required()
Такой вариант допускает строку " ", которая формально
не является undefined. Более строгая версия:
Yup.string().trim().required()
В контексте форм, особенно при работе с библиотеками управления
состоянием (например, Formik или React Hook Form),
required() играет роль первичного фильтра.
Он определяет:
Пример комплексной схемы:
const userSchema = Yup.object({
username: Yup.string()
.trim()
.min(3)
.max(20)
.required('Укажите имя пользователя'),
age: Yup.number()
.min(18)
.required('Возраст обязателен'),
tags: Yup.array()
.of(Yup.string())
.min(1)
.required('Добавьте хотя бы один тег')
});
Здесь required() выступает как базовый уровень проверки,
на который накладываются дополнительные ограничения.
Метод required() не отвечает за формат данных, диапазоны
или сложные правила. Его задача ограничена:
В сложных схемах он работает как фундамент, на который накладываются остальные правила валидации.