Валидация числовых значений в схемах играет ключевую роль при работе с формами и пользовательскими данными. Одним из базовых механизмов библиотеки 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 лет')
});
Поведение метода:
number().null и undefined могут требовать
дополнительной обработки через required();Метод max() определяет верхнюю границу допустимого
диапазона.
const schema = Yup.object({
score: Yup.number()
.max(100, 'Максимально допустимое значение — 100')
});
Поведение:
min();Наиболее распространённый сценарий — ограничение диапазона значений одновременно сверху и снизу.
const schema = Yup.object({
temperature: Yup.number()
.min(-50, 'Слишком низкое значение')
.max(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() необходимо учитывать, что
null не проходит числовую проверку без дополнительной
логики.
Yup.number()
.nullable()
.min(5)
.max(20)
В этом случае:
null допустим как отдельное состояние;Метод required() не заменяет min() и
max(), а дополняет их.
Yup.number()
.required('Поле обязательно')
.min(1)
.max(10)
Проверки выполняются последовательно:
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'), 'Максимум должен быть больше минимума')
})
Такой подход позволяет строить взаимосвязанные ограничения внутри одной модели данных.