В библиотеке Zod тип bigint представлен отдельным
примитивом схемы и поддерживает набор числовых ограничений, аналогичных
числам, но реализованных с учётом особенностей произвольной точности.
Использование bigint особенно важно в сценариях работы с
криптографией, финансовыми вычислениями, идентификаторами и системами,
где диапазон значений превышает возможности number.
Создание схемы начинается с базового конструктора:
import { z } from "zod";
const schema = z.bigint();
Такая схема принимает любое значение типа bigint без
ограничений по диапазону.
Примеры допустимых значений:
schema.parse(10n);
schema.parse(0n);
schema.parse(-999999999999999999n);
Любое значение типа number или string будет
отклонено, даже если оно выглядит числовым.
Для ограничения диапазона используются методы min и
max. Они определяют включительные границы допустимых
значений.
const schema = z.bigint().min(10n).max(100n);
Поведение:
10n — допустимо100n — допустимо9n — ошибка101n — ошибкаОграничения могут применяться по отдельности:
z.bigint().min(0n); // только неотрицательные значения
z.bigint().max(1000n); // верхняя граница без нижней
Для более точной настройки диапазона используются строгие и нестрогие операторы сравнения.
z.bigint().gt(10n); // строго больше 10n
z.bigint().gte(10n); // больше или равно 10n
Разница:
gt(10n) исключает 10ngte(10n) включает 10nz.bigint().lt(100n); // строго меньше 100n
z.bigint().lte(100n); // меньше или равно 100n
Ограничения можно комбинировать в цепочках, формируя диапазоны различной строгости.
const schema = z.bigint().gte(1n).lt(1000n);
Такой вариант задаёт полуоткрытый интервал:
Другой пример:
const schema = z.bigint().gt(0n).lt(10n);
Допустимые значения: от 1n до 9n.
Для удобства предусмотрены предустановленные ограничения:
z.bigint().positive(); // > 0n
z.bigint().nonnegative(); // >= 0n
z.bigint().negative(); // < 0n
z.bigint().nonpositive(); // <= 0n
Эти методы эквивалентны комбинациям базовых сравнений:
positive() → gt(0n)nonnegative() → gte(0n)negative() → lt(0n)nonpositive() → lte(0n)При несоответствии значения любому из условий схема возвращает структурированную ошибку валидации. Пример:
const schema = z.bigint().min(10n);
schema.parse(5n);
Результат: ошибка, указывающая на несоответствие минимальному значению.
Внутренне Zod формирует список issues, где фиксируется:
Ограничения bigint не смешиваются с
number:
z.bigint().min(1); // некорректно
Даже если значение выглядит числом, оно должно быть явно
bigint:
z.bigint().min(1n); // корректно
Это связано с тем, что bigint и number —
разные типы в JavaScript, и их сравнение требует строгой типизации.
Когда стандартных ограничений недостаточно, применяется
refine, позволяющий задавать произвольные правила.
const schema = z.bigint().refine((val) => val % 2n === 0n);
Здесь проверяется чётность значения.
Можно комбинировать с диапазонами:
const schema = z
.bigint()
.min(10n)
.max(1000n)
.refine((val) => val % 5n === 0n);
В этом случае значение должно:
const idSchema = z.bigint().positive().max(10_000_000n);
const moneySchema = z.bigint().nonnegative().min(100n);
const keySchema = z.bigint().gt(2n ** 1023n);
Операции сравнения bigint выполняются на уровне языка
JavaScript и не приводят к потерям точности, в отличие от
number. Ограничения Zod не преобразуют типы, а работают
поверх нативных сравнений, что исключает ошибки округления.
При этом:
bigint и number недопустимоbigintПри использовании JSON данные типа bigint требуют
предварительного преобразования, поскольку JSON не поддерживает этот
тип.
JSON.stringify(10n); // ошибка
Поэтому ограничения схемы применяются уже после корректного
приведения данных к bigint.
Ограничения могут использоваться совместно с преобразованиями:
const schema = z
.bigint()
.min(0n)
.transform((val) => val.toString());
Здесь происходит:
Такой подход часто применяется при сериализации значений для API.
Некоторые сценарии требуют особой осторожности:
nonnegative()gt/ltrefine без учёта базовых ограниченийПример конфликтного определения:
z.bigint().gt(10n).lt(10n);
Такое условие делает схему невыполнимой, так как не существует значения, удовлетворяющего обоим ограничениям.