Схема string в Yup представляет собой базовый
строительный блок для валидации текстовых значений в
JavaScript-объектах. Она используется для описания правил, которым
должна соответствовать строка: длина, формат, обязательность,
преобразования и дополнительные пользовательские проверки.
Создание строки в Yup начинается с вызова фабрики
string():
import * as Yup from 'yup';
const schema = Yup.string();
На этом этапе схема уже применима и считает валидными любые строковые
значения, включая пустую строку и undefined, если не
добавлены дополнительные ограничения.
Для указания обязательного поля используется метод
required():
const schema = Yup.string().required();
Поведение required() заключается в том, что значения
undefined, null и пустая строка считаются
невалидными. При этом важно учитывать, что пустая строка трактуется как
отсутствие значения, а не как корректный ввод.
Сообщение об ошибке может быть переопределено:
Yup.string().required('Поле обязательно для заполнения');
Метод notRequired() явно обозначает, что поле не
является обязательным, даже если ранее в цепочке использовались
ограничения.
По умолчанию строковая схема не принимает null. Для
разрешения этого значения используется nullable():
Yup.string().nullable();
Комбинация nullable() и required() требует
аккуратного применения, поскольку required() по-прежнему
будет отклонять null в большинстве сценариев.
Пустые строки при необходимости можно трактовать как отсутствие значения через кастомные преобразования.
Yup предоставляет набор методов для контроля длины строки:
Yup.string().min(5);
Значение должно содержать не менее 5 символов.
Yup.string().max(20);
Строка не может превышать 20 символов.
Yup.string().length(10);
Допустимы только строки длиной ровно 10 символов.
Каждый из методов поддерживает пользовательское сообщение:
Yup.string().min(5, 'Минимум 5 символов');
Метод matches() позволяет задавать произвольные
шаблоны:
Yup.string().matches(/^[a-zA-Z]+$/, 'Только латинские буквы');
Дополнительно можно управлять поведением при пустых значениях:
Yup.string().matches(/^[0-9]+$/, {
message: 'Только цифры',
excludeEmptyString: true
});
Регулярные выражения часто используются для проверки телефонов, кодов, идентификаторов и пользовательских форматов.
Yup включает набор специализированных валидаторов:
Yup.string().email('Некорректный email');
Проверка выполняется по стандартному шаблону email-адреса.
Yup.string().url('Некорректный URL');
Поддерживает стандартные протоколы и структуру адреса.
Хотя отдельного метода может не быть в базовой конфигурации, UUID часто реализуется через регулярные выражения:
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'
);
Yup позволяет автоматически изменять значение до проверки.
Удаление пробелов по краям:
Yup.string().trim();
Приведение к нижнему регистру:
Yup.string().lowercase();
Приведение к верхнему регистру:
Yup.string().uppercase();
Преобразования применяются до выполнения валидации, что влияет на итоговое сравнение с правилами.
Метод default() задаёт значение, если поле
отсутствует:
Yup.string().default('guest');
При валидации объектов это значение будет подставлено автоматически, если ключ не задан.
Метод test() используется для сложной логики, выходящей
за рамки стандартных ограничений:
Yup.string().test(
'no-spaces',
'Строка не должна содержать пробелы',
value => !value || !value.includes(' ')
);
Структура теста включает:
Функция может возвращать true/false или использовать
асинхронную логику:
Yup.string().test(
'check-exists',
'Значение не существует',
async value => {
const exists = await apiCheck(value);
return !exists;
}
);
Метод when() позволяет изменять правила в зависимости от
других полей:
Yup.string().when('role', {
is: 'admin',
then: schema => schema.required(),
otherwise: schema => schema.notRequired()
});
Также поддерживаются функции:
Yup.string().when('type', (type, schema) => {
return type === 'strict'
? schema.min(10)
: schema.min(3);
});
Методы Yup применяются в цепочке, и порядок имеет значение:
Yup.string()
.trim()
.lowercase()
.min(3)
.max(10)
.required();
Сначала выполняются преобразования, затем проверки ограничений, после чего применяется обязательность поля.
Пустые строки в Yup не всегда равнозначны отсутствию значения. В зависимости от схемы:
required() считает '' невалиднымnotRequired() допускает ''min() может интерпретировать '' как длину
0Для унификации часто используется комбинация:
Yup.string()
.trim()
.transform(value => (value === '' ? undefined : value))
.notRequired();
Каждый метод допускает передачу строки или объекта с параметрами:
Yup.string()
.min(5, 'Слишком короткое значение')
.max(10, 'Слишком длинное значение')
.required('Поле обязательно');
Также можно использовать функции для динамических сообщений:
Yup.string().min(5, ({ min }) => `Минимум ${min} символов`);
Строковые схемы часто используются внутри объектов:
const schema = Yup.object({
username: Yup.string().required(),
email: Yup.string().email().required(),
bio: Yup.string().max(200)
});
Каждое поле валидируется независимо, но в рамках общей структуры объекта.
Строковая схема в Yup работает как последовательный pipeline:
transform)trim, lowercase,
uppercase)required, nullable)min, max,
length)test)Такая структура обеспечивает предсказуемость результата даже при сложных цепочках правил.