Проверка на положительность и отрицательность

Валидация числовых значений в 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);  // ошибка

Поведение метода positive()

Ключевые особенности:

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

Проверка на положительные и нулевые значения

В случаях, когда допустим диапазон >= 0, используется комбинация с минимальным значением через min(0).

const schema = Yup.number().min(0);

schema.validate(10);  // валидно
schema.validate(0);   // валидно
schema.validate(-1);  // ошибка

Различие между positive и min(0)

  • positive() — строго больше нуля;
  • min(0) — больше или равно нулю.

Это различие критично при работе с финансовыми данными, индексами и количественными показателями.


Проверка на строго отрицательные значения

Метод negative() ограничивает значения строго меньше нуля. Ноль и положительные числа считаются ошибочными.

const schema = Yup.number().negative();

schema.validate(-10); // валидно
schema.validate(0);   // ошибка
schema.validate(5);   // ошибка

Семантика negative()

  • допускаются только значения < 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();
  • отрицательные значения → ошибка диапазона;
  • ноль → ошибка положительности.

Допустимость null и undefined

При необходимости разрешить отсутствие значения используется nullable():

const schema = Yup.number()
  .positive()
  .nullable();

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

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

Кастомные проверки через test()

Для сложных сценариев используется test(), позволяющий реализовать произвольную логику проверки знака числа.

const schema = Yup.number().test(
  'is-strictly-positive',
  'Число должно быть больше нуля',
  (value) => value > 0
);

Возможные расширения:

  • проверка диапазонов с динамическими границами;
  • зависимость от других полей формы;
  • бизнес-логика, выходящая за рамки стандартных методов Yup.

Сочетание проверок диапазона и знака

Методы можно комбинировать для создания строгих ограничений:

const schema = Yup.number()
  .positive()
  .max(100)
  .required();

Такой подход формирует одновременно:

  • нижнюю границу (> 0);
  • верхнюю границу (≤ 100);
  • обязательность значения.

Частые ошибки при проверке знака числа

При работе с положительными и отрицательными ограничениями часто возникают типовые ошибки:

1. Ожидание включения нуля в positive()

Метод positive() никогда не включает ноль, что часто игнорируется при проектировании форм.

2. Использование min(1) вместо positive()

Yup.number().min(1);

Функционально близко, но семантически менее выразительно и хуже отражает намерение.

3. Некорректная работа со строками

Yup.number().positive().validate(" 10 ");

Хотя Yup пытается привести значение, пробельные и нестандартные форматы могут давать NaN.


Поведение при NaN и нечисловых значениях

Любые значения, которые не могут быть преобразованы в число, автоматически отклоняются:

  • "abc"
  • {}
  • []
  • null (в зависимости от конфигурации)

При этом сообщение об ошибке зависит от конфигурации схемы и локализации.


Ограничения и предсказуемость проверки знака

Проверка положительности и отрицательности в Yup строго детерминирована:

  • positive() → строгое > 0
  • negative() → строгое < 0
  • min(0)>= 0
  • max(0)<= 0

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