Валидация строк в Zod строится вокруг трёх основных методов:
min, max и length. Эти методы
позволяют задавать минимальную, максимальную или строго фиксированную
длину строки.
Основная схема:
import { z } from "zod";
const schema = z.string().min(3).max(10);
В этом случае строка должна содержать не менее 3 символов и не более 10.
Метод min(n) задаёт нижнюю границу длины:
const usernameSchema = z.string().min(5);
Поведение:
"abc" — ошибка"hello" — валиднаВторым аргументом может передаваться сообщение об ошибке:
z.string().min(5, "Минимум 5 символов")
Метод max(n) ограничивает верхний предел:
const titleSchema = z.string().max(20);
Поведение:
"short title" — валидноМетод length(n) задаёт фиксированную длину:
const codeSchema = z.string().length(6);
Поведение:
"ABC123" — валидно"ABC" — ошибка"ABC1234" — ошибкаЭтот метод эквивалентен комбинации min(n).max(n).
Для числовых значений min и max работают
как ограничители диапазона.
const ageSchema = z.number().min(18).max(65);
z.number().min(0)
Ограничивает значение снизу:
-1 — ошибка0 — валидно10 — валидноz.number().max(100)
150 — ошибка100 — валидноz.number().min(10).max(20);
Формирует закрытый интервал [10, 20].
Для массивов методы min, max и
length применяются к количеству элементов.
const tagsSchema = z.array(z.string()).min(1).max(5);
z.array(z.number()).min(2);
[] — ошибка[1] — ошибка[1, 2] — валидноz.array(z.string()).max(3);
["a", "b", "c", "d"] — ошибка["a", "b"] — валидноz.array(z.string()).length(4);
Эквивалент:
z.array(z.string()).min(4).max(4);
Ограничения применяются не только к примитивам, но и к сложным типам.
const userSchema = z.object({
name: z.string().min(2).max(30),
roles: z.array(z.string()).min(1).max(3),
});
В этом случае:
name проверяется на длинуroles проверяется по количеству элементовZod допускает произвольный порядок:
z.string().max(10).min(3)
Результат идентичен стандартному варианту.
Каждый вызов добавляет новое правило в цепочку валидации:
z.string()
.min(3)
.max(10)
.min(5);
Фактически итоговый диапазон становится [5, 10].
Zod строго разделяет типовые ошибки и ошибки ограничений:
z.string().min(5)
12345 (число) — ошибка типа"abc" — ошибка минимальной длиныАналогично для чисел:
z.number().max(10)
"10" — ошибка типа20 — ошибка диапазонаДля каждого ограничения можно задать отдельное сообщение:
z.string()
.min(3, "Слишком короткая строка")
.max(10, "Слишком длинная строка");
То же применимо к числам и массивам:
z.number().min(0, "Значение не может быть отрицательным");
const passwordSchema = z.string().min(8).max(64);
const pageSchema = z.number().min(1);
const limitSchema = z.number().min(1).max(100);
const tagsSchema = z.array(z.string().min(1)).max(10);
length к числу вместо
min/maxmin/max преобразуют типы (Zod не
выполняет приведение)При использовании optional ограничения сохраняются, но
применяются только при наличии значения:
z.string().min(3).optional();
undefined — валидно"ab" — ошибка"abc" — валидноОграничения min, max, length
применяются после преобразований:
const schema = z.string()
.transform((val) => val.trim())
.min(3);
Сначала выполняется trim, затем проверяется длина
результата.
min — нижняя граница допустимого диапазонаmax — верхняя граница допустимого диапазонаlength — строго фиксированное значение размераЭти ограничения являются частью цепочки валидации и формируют предсказуемую систему проверки входных данных без скрытых преобразований типов или автоматической нормализации значений.