Валидация числовых диапазонов в Joi строится вокруг набора ограничений, позволяющих описывать допустимые границы значений с высокой точностью. Основные механизмы включают проверки минимального и максимального порога, а также строгие сравнительные условия, определяющие относительное положение числа.
Ограничения min и max задают включительные
границы диапазона. Значение считается допустимым, если оно попадает
внутрь указанного интервала, включая сами границы.
const schema = Joi.number()
.min(10)
.max(100);
В данном случае допустимыми считаются числа от 10 до 100 включительно.
Поведение:
Особенность этих методов заключается в том, что они работают
симметрично и задают замкнутый интервал [min, max].
При работе с целыми числами и дробными значениями логика не изменяется, однако важно учитывать тип входных данных, поскольку строковые представления чисел могут приводить к предварительным преобразованиям.
Joi.number().min(0).max(1)
Такое ограничение часто используется для вероятностных значений, коэффициентов и нормализованных показателей.
Методы greater и less задают строгие
неравенства, исключающие граничные значения. Они формируют открытые
интервалы.
const schema = Joi.number()
.greater(10)
.less(100);
Здесь допустимыми являются числа строго больше 10 и строго меньше 100.
Поведение:
(10, 100).Эти методы применяются в случаях, когда границы не должны включаться в область допустимых значений, например при расчётах, где крайние значения имеют отдельную семантику.
Обе пары методов могут использоваться совместно, однако их логика должна оставаться непротиворечивой. Внутри Joi при конфликтующих ограничениях применяется приоритет более строгих условий.
Joi.number()
.min(0)
.greater(-10)
.max(100)
.less(200);
Фактически итоговый диапазон определяется как пересечение условий:
greater(-10) и min(0) дают нижнюю границу
0;max(100) и less(200) дают верхнюю границу
100.Таким образом, конечный диапазон становится
[0, 100].
Если указана только одна сторона диапазона, вторая считается неограниченной.
Joi.number().min(5)
Такое правило допускает все значения от 5 и выше без верхнего ограничения.
Joi.number().less(10)
Здесь допустимы все значения меньше 10 без нижней границы.
При применении диапазонов важно учитывать особенности типов:
NaN всегда отклоняется независимо от условий;null не проходит числовую валидацию без явного
разрешения;В Joi ограничения диапазона реализуются как цепочка проверок, каждая из которых добавляет условие в схему. При выполнении валидации происходит последовательная проверка:
greater,
less);При наличии нескольких конфликтующих ограничений итоговое поведение определяется пересечением допустимых множеств.
Диапазон процентных значений:
Joi.number().min(0).max(100)
Диапазон исключая границы:
Joi.number().greater(0).less(1)
Ограничение возраста:
Joi.number().min(18).max(65)
Сильное ограничение для коэффициентов:
Joi.number().greater(-1).less(1)
При одновременном использовании методов, задающих включительные и исключительные границы, более строгие условия фактически сужают диапазон. Это позволяет гибко комбинировать правила без необходимости вручную пересчитывать границы.
Joi.number()
.min(10)
.greater(20)
Результат эквивалентен условию > 20, поскольку
greater(20) сильнее min(10).
Аналогично:
Joi.number()
.max(100)
.less(80)
Итоговое ограничение становится < 80.
Диапазоны могут применяться внутри объектов и массивов, где числовые поля подчиняются локальным правилам валидации.
Joi.object({
score: Joi.number().min(0).max(10),
threshold: Joi.number().greater(0).less(1)
});
Такая структура позволяет задавать независимые диапазоны для различных параметров одной сущности, сохраняя строгую типизацию и предсказуемое поведение проверки.