Минимальная и максимальная длина

Валидация минимальной и максимальной длины строк является одной из наиболее часто используемых операций при работе со схемами в 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')
});

Особенности:

  • проверяется числовое значение, а не строковое представление;
  • строковые значения преобразуются в число, если это возможно;
  • NaN считается невалидным значением.

Дополнительная защита от нечисловых значений:

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() работают на финальном значении после трансформаций.