Числовые ограничения в Zod используются для валидации диапазонов
значений и позволяют задавать строгие условия на допустимые числа в
схемах. Эти ограничения применяются к типу number и
обеспечивают контроль границ, знака числа и допустимых интервалов.
Методы min() и max() задают нижнюю и
верхнюю границы допустимого числового диапазона.
Метод min() определяет наименьшее допустимое
значение.
import { z } from "zod";
const schema = z.number().min(10);
schema.parse(15); // корректно
schema.parse(10); // корректно
schema.parse(5); // ошибка
Логика проверки:
Второй параметр позволяет изменить сообщение об ошибке:
z.number().min(10, "Минимум 10")
Метод max() задаёт верхнюю границу допустимого
диапазона.
const schema = z.number().max(100);
schema.parse(50); // корректно
schema.parse(100); // корректно
schema.parse(150); // ошибка
Условие:
Комбинация min и max формирует закрытый
интервал:
const schema = z.number().min(10).max(100);
schema.parse(50); // корректно
schema.parse(10); // корректно
schema.parse(100); // корректно
schema.parse(9); // ошибка
schema.parse(101); // ошибка
Такой подход эквивалентен проверке диапазона
[10, 100].
Zod поддерживает построение строгих интервалов через комбинацию
min и max, но без встроенного параметра
“exclusive” для чисел (в отличие от некоторых других библиотек).
Эксклюзивные границы реализуются через смещение значений:
const schema = z.number().min(11).max(99);
Это фактически интервал (10, 100).
Метод positive() ограничивает значения только
положительными числами (строго больше нуля).
const schema = z.number().positive();
schema.parse(1); // корректно
schema.parse(100); // корректно
schema.parse(0); // ошибка
schema.parse(-5); // ошибка
Особенности:
0 не считается положительнымmin(0, { exclusive: true }) в логическом
смыслеСценарии применения:
Можно комбинировать с другими ограничениями:
const schema = z.number().positive().max(1000);
Метод negative() ограничивает значения строго
отрицательными числами (меньше нуля).
const schema = z.number().negative();
schema.parse(-1); // корректно
schema.parse(-100); // корректно
schema.parse(0); // ошибка
schema.parse(5); // ошибка
Особенности:
Пример комбинирования:
const schema = z.number().negative().min(-100);
Это задаёт диапазон [-100, 0).
Методы positive() и negative() фактически
задают базовое ограничение знака числа, а min() и
max() уточняют диапазон.
const schema = z.number().positive().max(10);
schema.parse(5); // корректно
schema.parse(10); // корректно
schema.parse(0); // ошибка
schema.parse(11); // ошибка
Диапазон: (0, 10]
const schema = z.number().negative().min(-10);
schema.parse(-5); // корректно
schema.parse(-10); // корректно
schema.parse(0); // ошибка
schema.parse(-11); // ошибка
Диапазон: [-10, 0)
Zod строго валидирует числа, и значения вроде NaN не
проходят проверку ни при каких диапазонах:
z.number().min(0).parse(NaN); // ошибка
Также не допускаются:
Infinity-InfinityЭто важно, поскольку диапазонные методы предполагают конечные числовые значения.
const ageSchema = z.number().min(0).max(120);
Логика:
const percentSchema = z.number().min(0).max(100);
Часто используется в:
const priceSchema = z.number().positive();
Или с ограничением:
const priceSchema = z.number().positive().max(1_000_000);
const temperatureSchema = z.number().min(-100).max(100);
Подходит для ограниченных физических диапазонов.
Zod по умолчанию не приводит строки к числам, если не использовать
z.coerce.number():
z.number().min(10).parse("15"); // ошибка
С коэрсией:
z.coerce.number().min(10).parse("15"); // корректно
Диапазонные ограничения применяются уже после преобразования типа.
Диапазоны часто используются вместе с дополнительными ограничениями:
const schema = z.number().int().min(1).max(10);
const schema = z.number().min(1).max(100).refine((n) => n % 2 === 0);
const schema = z.number().min(0).max(1).refine((n) => n % 0.1 === 0);
Каждое ограничение генерирует структурированную ошибку с кодом:
too_small — значение ниже минимумаtoo_big — значение выше максимумаПример:
z.number().min(10).parse(5);
Результат ошибки содержит:
too_small)minimum: 10)При множественных ограничениях Zod не пересчитывает диапазон, а последовательно применяет проверки:
z.number()
.min(0)
.positive()
.max(10);
Фактически:
positive() уже исключает 0min(0) становится избыточным(0, 10]z.number().min(10).max(5);
Такая схема формально валидна при объявлении, но никогда не пропустит значение.
z.number().positive().min(1);
positive() уже подразумевает > 0,
поэтому min(1) дополнительно сужает диапазон.
z.number().min(10).parse("20");
Ошибка возникает из-за отсутствия коэрсии.
Диапазонные методы в Zod формируют основу строгой числовой валидации, позволяя точно описывать допустимые границы, знаковые ограничения и комбинировать их с дополнительными правилами проверки без необходимости ручной реализации условной логики.