Валидация минимальной и максимальной длины строк является одной из наиболее часто используемых операций при работе со схемами в Yup. Она применяется при проверке пользовательского ввода, паролей, заголовков, описаний и любых текстовых полей, где важны границы допустимого объёма данных.
Базовая конфигурация строки строится через string():
import * as Yup from 'yup';
const schema = Yup.object({
username: Yup.string()
});
Метод min() задаёт нижнюю границу допустимого количества
символов:
const schema = Yup.object({
username: Yup.string()
.min(3, 'Минимальная длина — 3 символа')
});
Поведение проверки:
required();transform() или trim().Дополнительная очистка пробелов:
Yup.string()
.trim()
.min(3, 'Слишком короткое значение')
Метод max() ограничивает верхний предел количества
символов:
const schema = Yup.object({
username: Yup.string()
.max(20, 'Максимальная длина — 20 символов')
});
Особенности поведения:
trim() лишние пробелы исключаются
из расчёта.Часто оба ограничения применяются одновременно:
const schema = Yup.object({
username: Yup.string()
.min(3, 'Минимум 3 символа')
.max(20, 'Максимум 20 символов')
});
Такая конструкция формирует диапазон допустимой длины и используется для большинства текстовых полей.
Для чисел методы min() и max() работают как
ограничения диапазона значений, а не количества символов.
const schema = Yup.object({
age: Yup.number()
.min(18, 'Минимальный возраст 18')
.max(65, 'Максимальный возраст 65')
});
Особенности:
Дополнительная защита от нечисловых значений:
Yup.number()
.typeError('Должно быть числом')
.min(0)
.max(100)
Для массивов методы min() и max()
определяют допустимое количество элементов:
const schema = Yup.object({
tags: Yup.array()
.min(1, 'Минимум один элемент')
.max(5, 'Не более пяти элементов')
});
Поведение:
min(1);Метод length() задаёт строго фиксированное значение
длины:
Yup.string()
.length(6, 'Длина должна быть ровно 6 символов')
Для массивов аналогично:
Yup.array()
.length(3, 'Требуется ровно 3 элемента')
Каждый метод ограничения поддерживает кастомизацию текста ошибки:
Yup.string()
.min(5, ({ min }) => `Минимум ${min} символов`)
.max(10, ({ max }) => `Максимум ${max} символов`)
Функциональная форма позволяет динамически формировать сообщение на основе параметров валидации.
Перед применением min() и max() часто
выполняются преобразования:
Yup.string()
.transform(value => value?.trim())
.min(3)
.max(30)
Также используется нормализация регистра:
Yup.string()
.transform(value => value?.toLowerCase())
.min(3)
Преобразование влияет на итоговую длину, поскольку проверка выполняется после трансформации.
Длина может зависеть от других полей схемы через
when():
const schema = Yup.object({
role: Yup.string(),
code: Yup.string().when('role', {
is: 'admin',
then: schema => schema.min(10).max(10),
otherwise: schema => schema.min(5).max(20)
})
});
Механика:
required() усиливает поведение min():
Yup.string()
.required('Поле обязательно')
.min(3, 'Слишком короткое значение')
Различие:
required() пустое значение допускается;required() пустая строка нарушает валидацию
независимо от min().При комбинировании нескольких ограничений порядок не влияет на результат, но влияет на текст ошибки:
Yup.string()
.required()
.min(3)
.max(10)
.trim()
Поведение:
trim() влияет на итоговую длину;required() проверяется отдельно от диапазона;min() и max() работают на финальном
значении после трансформаций.