Валидация email-адресов в Yup строится на цепочке методов схемы
строк, где базовая проверка формата дополняется набором ограничений и
пользовательских правил. Основной инструмент —
string().email(), который реализует проверку соответствия
значения стандартному шаблону email.
В Yup email обычно описывается через строковую схему:
import * as yup from "yup";
const schema = yup.object({
email: yup.string().email(),
});
Метод email() проверяет структуру строки: наличие
локальной части, символа @ и домена. При этом сама проверка
не гарантирует существование адреса или его доставляемость, она
ограничивается синтаксическим соответствием.
По умолчанию строка может быть пустой или undefined,
поэтому в большинстве случаев email комбинируется с
required():
const schema = yup.object({
email: yup.string().email().required(),
});
Порядок вызовов влияет на поведение сообщений об ошибках. Приоритет
обычно отдается required(), так как пустое значение должно
обрабатываться отдельно от некорректного формата.
Каждый метод в цепочке может принимать сообщение об ошибке:
const schema = yup.object({
email: yup
.string()
.email("Некорректный формат email")
.required("Email обязателен"),
});
Такой подход позволяет разделять ошибки по типам: отсутствие значения и нарушение формата.
Встроенная проверка email основана на регулярном выражении. Оно охватывает большинство стандартных случаев, но не является исчерпывающим RFC-валидатором. Это важно учитывать при строгих требованиях к корпоративным системам.
Валидация не учитывает:
Для более строгих сценариев используется метод test(),
позволяющий добавлять собственную логику:
const schema = yup.object({
email: yup
.string()
.email()
.test("no-disposable", "Временные email запрещены", (value) => {
if (!value) return true;
return !value.endsWith("@tempmail.com");
}),
});
test() получает значение поля и возвращает
true или false, определяя валидность.
Часто email требует предварительной обработки: обрезки пробелов,
приведения к нижнему регистру. В Yup это реализуется через
transform():
const schema = yup.object({
email: yup
.string()
.transform((value) => value?.trim().toLowerCase())
.email()
.required(),
});
Transform выполняется до валидации, что позволяет унифицировать входные данные.
При работе с формами часто возникает необходимость различать
null, пустую строку и отсутствие значения:
const schema = yup.object({
email: yup.string().email().nullable(),
});
nullable() разрешает null как допустимое
значение, но не заменяет required().
Yup поддерживает зависимость от других полей через
when(). Это используется, например, при альтернативных
способах авторизации:
const schema = yup.object({
loginType: yup.string(),
email: yup.string().when("loginType", {
is: "email",
then: (schema) => schema.email().required(),
otherwise: (schema) => schema.notRequired(),
}),
});
Такая конструкция позволяет динамически менять правила валидации без дублирования схем.
Email-поле часто становится частью комплексной бизнес-логики:
const schema = yup.object({
email: yup
.string()
.trim()
.lowercase()
.email()
.required()
.test("company-domain", "Разрешены только корпоративные email", (value) => {
if (!value) return false;
return value.endsWith("@company.com");
}),
});
Здесь объединяются нормализация, стандартная проверка и доменная фильтрация.
Особенность Yup заключается в том, что пустая строка ""
не считается undefined. Поэтому без дополнительной
обработки email().required() может пропускать некорректные
сценарии. Часто используется трансформация:
.transform((value) => (value === "" ? undefined : value))
Это приводит поведение к более предсказуемому виду.
Валидация email в Yup часто применяется в связке с библиотеками управления формами, где схема используется как единый источник правил. При этом Yup выполняет синхронную и асинхронную проверку, возвращая структурированный объект ошибок.
Несмотря на удобство, встроенный метод email() имеет
ограничения:
Для строгих систем применяется комбинация regex + DNS/SMTP проверок вне Yup.
В реальных проектах email-схема обычно строится по принципу слоев:
trim, lowercase)required)email)test)when)Такая структура позволяет масштабировать правила без потери читаемости и предсказуемости поведения.