Валидация числовых значений в Yup строится вокруг схемы
number(), которая задаёт правила проверки для всех входящих
данных, приводимых к числу. Важный момент заключается в том, что
библиотека по умолчанию пытается привести входное значение к числовому
типу, если это возможно.
import * as Yup from 'yup';
const schema = Yup.number();
При таком объявлении схема уже способна валидировать значения, но не накладывает ограничений на знак числа. Для задач, связанных с проверкой положительности и отрицательности, используются специализированные методы.
Метод positive() используется для ограничения значений
строго больше нуля. Это означает, что допустимы любые числа
> 0, но ноль и отрицательные значения считаются
ошибкой.
const schema = Yup.number().positive();
schema.validate(10); // валидно
schema.validate(0); // ошибка
schema.validate(-5); // ошибка
Ключевые особенности:
В случаях, когда допустим диапазон >= 0, используется
комбинация с минимальным значением через min(0).
const schema = Yup.number().min(0);
schema.validate(10); // валидно
schema.validate(0); // валидно
schema.validate(-1); // ошибка
positive() — строго больше нуля;min(0) — больше или равно нулю.Это различие критично при работе с финансовыми данными, индексами и количественными показателями.
Метод negative() ограничивает значения строго меньше
нуля. Ноль и положительные числа считаются ошибочными.
const schema = Yup.number().negative();
schema.validate(-10); // валидно
schema.validate(0); // ошибка
schema.validate(5); // ошибка
< 0;Для диапазона <= 0 применяется
max(0).
const schema = Yup.number().max(0);
schema.validate(-3); // валидно
schema.validate(0); // валидно
schema.validate(2); // ошибка
Ноль в числовой валидации играет особую роль, так как он одновременно:
Примеры:
Yup.number().positive(); // 0 не проходит
Yup.number().min(0); // 0 проходит
Yup.number().negative(); // 0 не проходит
Yup.number().max(0); // 0 проходит
Yup автоматически пытается преобразовать строки в числа:
const schema = Yup.number().positive();
schema.validate("10"); // валидно (преобразуется в 10)
schema.validate("0"); // ошибка
schema.validate("abc"); // ошибка
Особенности преобразования:
NaN;null и undefined требуют явной обработки
через nullable() или required();Числовая проверка часто сочетается с обязательностью значения:
const schema = Yup.number()
.positive()
.required();
Поведение:
undefined → ошибка обязательности;null → ошибка, если не разрешено
nullable();При необходимости разрешить отсутствие значения используется
nullable():
const schema = Yup.number()
.positive()
.nullable();
В этом случае:
null считается допустимым;undefined может требовать отдельной обработки через
required() или отсутствие этого метода.Для сложных сценариев используется test(), позволяющий
реализовать произвольную логику проверки знака числа.
const schema = Yup.number().test(
'is-strictly-positive',
'Число должно быть больше нуля',
(value) => value > 0
);
Возможные расширения:
Методы можно комбинировать для создания строгих ограничений:
const schema = Yup.number()
.positive()
.max(100)
.required();
Такой подход формирует одновременно:
При работе с положительными и отрицательными ограничениями часто возникают типовые ошибки:
Метод positive() никогда не включает ноль, что часто
игнорируется при проектировании форм.
Yup.number().min(1);
Функционально близко, но семантически менее выразительно и хуже отражает намерение.
Yup.number().positive().validate(" 10 ");
Хотя Yup пытается привести значение, пробельные и нестандартные
форматы могут давать NaN.
Любые значения, которые не могут быть преобразованы в число, автоматически отклоняются:
"abc"{}[]null (в зависимости от конфигурации)При этом сообщение об ошибке зависит от конфигурации схемы и локализации.
Проверка положительности и отрицательности в Yup строго детерминирована:
positive() → строгое > 0negative() → строгое < 0min(0) → >= 0max(0) → <= 0Эта предсказуемость позволяет точно моделировать бизнес-правила, связанные с числовыми ограничениями, без необходимости ручной реализации базовой логики сравнения.