В экосистеме валидации форм JavaScript одним из наиболее распространённых инструментов является связка Yup + YupResolver, используемая вместе с React Hook Form. Основная ценность Yup заключается в декларативном описании схем данных, где каждый тип имеет набор встроенных методов валидации.
Для строковых значений ключевую роль играют специализированные
валидаторы форматов, среди которых особенно часто применяются
email() и url().
Любая схема начинается с определения структуры объекта:
import * as Yup from "yup";
const schema = Yup.object({
email: Yup.string(),
website: Yup.string(),
});
На этом уровне поля существуют, но не имеют ограничений. Вся сила Yup раскрывается при добавлении встроенных методов.
Метод email() проверяет соответствие строки стандартному
формату электронной почты. Проверка выполняется на основе регулярного
выражения, встроенного в библиотеку.
const schema = Yup.object({
email: Yup.string()
.email("Некорректный формат email")
.required("Email обязателен"),
});
@email() не гарантирует существование адреса, он
проверяет только синтаксис. Следовательно, адрес
test@domain.fake будет считаться валидным.
На практике email редко используется отдельно. Обычно он комбинируется с дополнительными строковыми правилами:
const schema = Yup.object({
email: Yup.string()
.trim()
.lowercase()
.email("Некорректный email")
.max(255, "Слишком длинный email")
.required("Обязательное поле"),
});
trim() — удаляет пробелы по краямlowercase() — нормализует регистрemail() — проверяет форматmax() — ограничивает длинуТакой подход обеспечивает не только проверку, но и нормализацию данных.
Метод url() используется для проверки корректности
веб-адресов.
const schema = Yup.object({
website: Yup.string()
.url("Некорректный URL")
.required("Укажите сайт"),
});
Допустимые форматы:
Недопустимые:
В большинстве случаев Yup ожидает наличие протокола
http:// или https://.
URL проверяется на:
const schema = Yup.object({
website: Yup.string()
.trim()
.url("Неверный формат ссылки")
.lowercase()
.required(),
});
Порядок имеет значение: трансформации выполняются до финальной проверки.
Помимо email и url, библиотека предоставляет дополнительные методы для работы со строками.
Метод matches() позволяет описывать любые форматы
вручную.
const schema = Yup.object({
phone: Yup.string()
.matches(
/^\+?[0-9]{10,15}$/,
"Некорректный номер телефона"
)
});
В Yup нет отдельного uuid() во всех версиях, но часто
используется через matches():
const schema = Yup.object({
id: Yup.string().matches(
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
"Некорректный UUID"
),
});
Методы нормализации регистра:
const schema = Yup.object({
code: Yup.string()
.uppercase()
.required(),
});
или
const schema = Yup.object({
username: Yup.string()
.lowercase()
.required(),
});
Удаляет пробелы по краям:
Yup.string().trim()
Особенно важно для email и url, где лишние пробелы приводят к неочевидным ошибкам.
Ограничение длины:
const schema = Yup.object({
title: Yup.string()
.min(5, "Слишком коротко")
.max(100, "Слишком длинно"),
});
Yup.string().required("Поле обязательно")
Отклоняет:
Yup.string().nullable()
Позволяет явно хранить null.
При использовании React Hook Form Yup интегрируется через resolver:
import { useForm } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
const schema = Yup.object({
email: Yup.string().email().required(),
website: Yup.string().url(),
});
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
resolver: yupResolver(schema),
});
Каждый валидатор (email, url,
matches) возвращает стандартный объект ошибки:
{
path: "email",
message: "Некорректный формат email",
value: "test@"
}
Это позволяет унифицировать обработку UI-ошибок.
Yup.string().email()
Пробел в конце делает адрес невалидным.
Yup.string()
.email()
.trim()
Ошибка: trim должен идти до email.
email() не выполняет DNS-проверку и не проверяет
почтовый сервер.
const schema = Yup.object({
email: Yup.string()
.trim()
.lowercase()
.email("Ошибка email")
.test("no-disposable", "Временные email запрещены", (value) => {
if (!value) return true;
return !value.includes("tempmail");
}),
});
Встроенные форматы Yup эффективны при соблюдении нескольких принципов:
Методы email() и url() не заменяют
required(). Без него поле может считаться валидным даже при
пустом значении:
Yup.string().email() // пустая строка может пройти
Корректный вариант:
Yup.string().email().required()