Строковые значения являются базовым типом данных в большинстве пользовательских форм. При использовании схем валидации через YupResolver строковые поля проходят многоуровневую проверку: от базового контроля типа до сложных правил соответствия формату, длине и семантическим ограничениям.
Строка в контексте Yup рассматривается не как «просто текст», а как объект с набором трансформаций и правил, применяемых последовательно.
Основой работы со строками является метод string():
import * as yup from "yup";
const schema = yup.object({
username: yup.string()
});
Такое определение гарантирует, что поле username будет
интерпретировано как строковое значение. Однако без дополнительных
ограничений любая строка, включая пустую, считается валидной.
Контроль обязательности реализуется через
required():
const schema = yup.object({
username: yup.string().required("Поле обязательно для заполнения")
});
Механика проверки:
undefined → ошибкаnull → ошибка (если не разрешено явно)"" → ошибка, если не переопределено поведениеСтроковые поля часто требуют явного указания обязательности, поскольку пустая строка считается валидным значением JavaScript-типа string.
Yup предоставляет инструменты для контроля длины:
const schema = yup.object({
username: yup
.string()
.min(3, "Минимум 3 символа")
.max(20, "Максимум 20 символов")
});
Логика применения:
min(n) — проверка нижней границы длиныmax(n) — проверка верхней границы длиныОбе проверки выполняются после приведения значения к строке.
Метод matches() используется для строгой валидации
формата:
const schema = yup.object({
username: yup
.string()
.matches(/^[a-zA-Z0-9_]+$/, "Недопустимые символы")
});
Типичные сценарии:
Регулярное выражение применяется к уже преобразованной строке, что позволяет централизованно управлять правилами формата.
Yup включает специализированные методы для распространённых сценариев.
email: yup.string().email("Некорректный email")
Внутри используется набор предопределённых правил RFC-формата с упрощениями для практического применения.
website: yup.string().url("Некорректный URL")
Проверяется структура протокола, домена и пути.
id: yup.string().uuid("Некорректный UUID")
Подобные методы обеспечивают единообразную валидацию без ручных регулярных выражений.
Перед валидацией строки могут быть преобразованы:
username: yup.string().trim()
Удаляет пробелы в начале и конце строки до применения остальных правил.
comment: yup.string().nullable()
Позволяет явно разрешить null как допустимое
значение.
bio: yup.string().transform((value) => {
return value === "" ? null : value;
})
Трансформация применяется до этапа основной проверки, что позволяет унифицировать обработку данных.
Строковые поля могут иметь дефолтные значения:
const schema = yup.object({
nickname: yup.string().default("guest")
});
При отсутствии значения в данных формы автоматически подставляется указанная строка.
Строковая схема часто представляет собой цепочку ограничений:
const schema = yup.object({
username: yup
.string()
.trim()
.required("Обязательное поле")
.min(3, "Слишком короткое")
.max(15, "Слишком длинное")
.matches(/^[a-z0-9_]+$/, "Только латиница, цифры и _")
});
Порядок имеет значение:
trim)required)min, max)matches)Такой порядок снижает количество ложных ошибок и упрощает диагностику.
Если значение не является строкой, Yup пытается привести его:
"123""true" / "false"null → зависит от nullable()Явное управление типами позволяет избежать неожиданных преобразований:
yup.string().strict(true)
В строгом режиме автоматическое приведение отключается.
Пустая строка является отдельным случаем, отличным от
undefined и null.
Контроль поведения:
yup.string().required()
yup.string().notRequired()
yup.string().nullable()
Комбинации позволяют точно задавать допустимые состояния поля.
Строковые поля могут зависеть от других значений схемы:
passwordConfirm: yup.string().when("password", (password, schema) => {
return schema.oneOf([password], "Пароли не совпадают");
});
Механизм when() позволяет строить динамические правила,
где строковая валидация зависит от контекста формы.
При использовании YupResolver строковые правила передаются в резолвер, который преобразует ошибки Yup в структуру, понятную системе формы:
import { useForm } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
const { register, handleSubmit, formState } = useForm({
resolver: yupResolver(schema)
});
Особенности обработки:
Строковые ограничения поддерживают кастомизацию сообщений:
yup.string().min(5, ({ min }) => `Минимум ${min} символов`)
Использование функций позволяет динамически формировать текст ошибок на основе параметров схемы.
Строковые проверки в Yup оптимизированы для последовательного выполнения:
required, min,
max) выполняются быстроПри использовании через YupResolver повторные пересчёты минимизируются за счёт кеширования состояния формы.
required без учёта пустой строкиtrim() при работе с пользовательским
вводомnullable и required без
понимания приоритетаКаждый из этих случаев приводит к различию между ожидаемой и фактической логикой валидации, особенно в динамических формах.