Минимальное и максимальное значение

Валидация числовых значений в схемах играет ключевую роль при работе с формами и пользовательскими данными. Одним из базовых механизмов библиотеки Yup является контроль диапазона значений через установку минимальных и максимальных границ.


Числовой тип и базовая структура ограничения

Для работы с числовыми значениями используется Yup.number(). Этот тип определяет, что входное значение должно быть числом и позволяет применять дополнительные правила валидации.

import * as Yup from 'yup';

const schema = Yup.object({
  age: Yup.number()
});

На этом этапе поле age проверяется только на принадлежность к числу. Любое дополнительное ограничение задаётся через методы min и max.


Установка минимального значения

Метод min() задаёт нижнюю границу допустимого значения. Все числа, меньшие указанного порога, считаются невалидными.

const schema = Yup.object({
  age: Yup.number()
    .min(18, 'Минимальный возраст — 18 лет')
});

Поведение метода:

  • значение меньше 18 → ошибка валидации;
  • значение 18 и выше → проходит проверку;
  • нечисловые значения обрабатываются отдельно в рамках number().

Важные особенности min()

  • сравнение происходит строго по числовому значению;
  • null и undefined могут требовать дополнительной обработки через required();
  • сообщение об ошибке задаётся вторым аргументом.

Установка максимального значения

Метод max() определяет верхнюю границу допустимого диапазона.

const schema = Yup.object({
  score: Yup.number()
    .max(100, 'Максимально допустимое значение — 100')
});

Поведение:

  • значение больше 100 → ошибка;
  • значение 100 и ниже → допустимо.

Особенности max()

  • работает симметрично с min();
  • учитывает только числовые значения;
  • позволяет задавать бизнес-ограничения (например, процентные шкалы или лимиты).

Совместное использование min и max

Наиболее распространённый сценарий — ограничение диапазона значений одновременно сверху и снизу.

const schema = Yup.object({
  temperature: Yup.number()
    .min(-50, 'Слишком низкое значение')
    .max(50, 'Слишком высокое значение')
});

Логика проверки:

  • значение должно быть не меньше -50;
  • значение должно быть не больше 50;
  • всё, что выходит за пределы диапазона, считается невалидным.

Порядок вызова методов

Хотя порядок min() и max() не влияет на результат валидации, он может улучшать читаемость схемы.

Рекомендуемая последовательность:

Yup.number().min(...).max(...)

Такой порядок отражает естественное чтение диапазона слева направо: от минимального к максимальному значению.


Поведение при некорректных типах данных

При передаче строк, объектов или других типов поведение зависит от предварительной обработки Yup.

Примеры:

  • строка "20" может быть преобразована в число при использовании .transform();
  • пустая строка "" часто интерпретируется как NaN;
  • NaN всегда считается невалидным числом.
Yup.number()
  .transform((value, originalValue) => {
    return originalValue === '' ? undefined : value;
  })
  .min(10)

Включение или исключение границ

Методы min() и max() по умолчанию включают граничные значения:

  • min(10) допускает значение 10;
  • max(100) допускает значение 100.

Если требуется исключить границы, используется комбинация кастомной логики через test():

Yup.number().test(
  'exclusive-min',
  'Значение должно быть больше 10',
  value => value > 10
);

Работа с nullable значениями

При использовании nullable() необходимо учитывать, что null не проходит числовую проверку без дополнительной логики.

Yup.number()
  .nullable()
  .min(5)
  .max(20)

В этом случае:

  • null допустим как отдельное состояние;
  • числовые ограничения применяются только к числам.

Влияние required() на диапазон

Метод required() не заменяет min() и max(), а дополняет их.

Yup.number()
  .required('Поле обязательно')
  .min(1)
  .max(10)

Проверки выполняются последовательно:

  1. наличие значения;
  2. соответствие типу;
  3. попадание в диапазон.

Использование в реальных сценариях

Ограничение возраста

Yup.number()
  .min(0)
  .max(120)

Процентные значения

Yup.number()
  .min(0)
  .max(100)

Лимиты ресурсов

Yup.number()
  .min(1)
  .max(1000)

Частые ошибки при работе с диапазонами

  • попытка валидировать строку без преобразования;
  • отсутствие обработки NaN;
  • использование min/max без number();
  • смешивание бизнес-логики и валидации без явных сообщений об ошибках;
  • игнорирование nullable при допустимости пустых значений.

Поведение при цепочке трансформаций

При сложных схемах порядок имеет значение:

Yup.number()
  .transform(...)
  .min(...)
  .max(...)
  .required(...)

Трансформации применяются до проверки диапазона, поэтому некорректная обработка может привести к неожиданным результатам в min и max.


Валидация с динамическими границами

Границы могут зависеть от других значений схемы.

Yup.object({
  minValue: Yup.number(),
  maxValue: Yup.number()
    .min(Yup.ref('minValue'), 'Максимум должен быть больше минимума')
})

Такой подход позволяет строить взаимосвязанные ограничения внутри одной модели данных.