Тип string в Zod используется для валидации строковых
значений и является одним из базовых строительных блоков схем. Он
применяется для проверки пользовательского ввода, данных API,
конфигураций и любых текстовых значений.
Базовое определение:
import { z } from "zod";
const schema = z.string();
Такая схема допускает любое значение типа string и
отклоняет все остальные типы: числа, булевы значения, объекты,
null, undefined.
Zod предоставляет встроенные методы для ограничения длины строки:
const usernameSchema = z.string().min(3).max(20);
min(n) — минимальная длина строкиmax(n) — максимальная длина строкиПри нарушении ограничений возвращается структурированная ошибка валидации.
Частый случай — запрет пустых значений:
const nonEmpty = z.string().min(1);
Альтернативный вариант с явным смыслом:
const nonEmpty = z.string().nonempty();
nonempty() эквивалентен min(1), но делает
намерение более явным.
Регулярные выражения позволяют задавать строгие правила формата:
const codeSchema = z.string().regex(/^[A-Z0-9]{6}$/);
Примеры использования:
Zod включает набор встроенных проверок распространённых форматов:
z.string().email();
z.string().url();
z.string().uuid();
Примеры:
const emailSchema = z.string().email();
const urlSchema = z.string().url();
const idSchema = z.string().uuid();
Эти методы упрощают работу с типовыми данными и уменьшают необходимость в ручных регулярных выражениях.
Zod позволяет применять трансформации к строкам:
const trimmed = z.string().transform((val) => val.trim());
Комбинация валидации и преобразования:
const normalizedEmail = z
.string()
.email()
.transform((val) => val.toLowerCase().trim());
Преобразования выполняются после успешной валидации.
Тип number используется для валидации числовых значений,
включая целые и дробные числа. Он исключает строки, даже если они
содержат числовое представление.
Базовое определение:
const schema = z.number();
Zod предоставляет методы ограничения диапазонов значений:
const ageSchema = z.number().min(0).max(120);
min(n) — минимальное значениеmax(n) — максимальное значениеДополнительно:
const positive = z.number().positive();
const nonNegative = z.number().nonnegative();
const negative = z.number().negative();
const nonPositive = z.number().nonpositive();
Для ограничения только целыми значениями:
const intSchema = z.number().int();
Это исключает дробные числа вроде 1.5, 0.1,
-3.2.
Метод multipleOf проверяет делимость числа:
const evenSchema = z.number().multipleOf(2);
Примеры:
10 проходит11 не проходитПо умолчанию NaN, Infinity и
-Infinity считаются невалидными:
z.number().safeParse(NaN); // ошибка
При необходимости можно ослабить проверки через предварительные преобразования:
const schema = z.preprocess((val) => Number(val), z.number());
Частая задача — преобразование строкового ввода:
const schema = z.string().transform((val) => Number(val));
Более корректный вариант с валидацией:
const schema = z
.string()
.regex(/^\d+$/)
.transform(Number);
Тип boolean используется для строгой проверки логических
значений.
Базовая схема:
const schema = z.boolean();
Допустимые значения:
truefalseЛюбые другие типы (0, 1,
"true", "false") отклоняются без
преобразования.
В реальных приложениях часто требуется интерпретация строк или чисел как булевых значений.
Простейший вариант:
const schema = z.coerce.boolean();
Поведение:
"true" → true"false" → true (важно: непустая
строка)1 → true0 → falseТакой подход зависит от внутренних правил JavaScript преобразования типов и требует осторожности.
Более контролируемый вариант:
const schema = z.string().transform((val) => val === "true");
Расширенная логика:
const schema = z.union([
z.literal(true),
z.literal(false),
z.string().transform((val) => val === "true"),
z.number().transform((val) => val === 1),
]);
Для исключения любых не-boolean значений:
const strictBoolean = z.boolean().strict();
Такой подход полезен при работе с API, где требуется жёсткое соответствие контракту данных.
Примитивные схемы часто используются в составе более сложных структур:
const userSchema = z.object({
name: z.string().min(2),
age: z.number().int().min(0),
isActive: z.boolean(),
});
Такое комбинирование обеспечивает строгую типизацию входных данных без необходимости ручной проверки.
Zod выполняет валидацию в два этапа:
Это влияет на порядок операций:
const schema = z
.string()
.min(3)
.transform((val) => val.toUpperCase());
Сначала проверяется длина строки, затем выполняется преобразование.
Каждая примитивная схема поддерживает безопасный режим:
const result = z.string().safeParse(123);
Результат:
{
success: false,
error: ZodError
}
Успешный вариант:
{
success: true,
data: "value"
}
Этот механизм используется для контроля ошибок без выбрасывания исключений.