Инструменты кодогенерации в экосистеме Zod занимают промежуточное положение между типобезопасностью TypeScript и декларативным описанием данных. Их задача — автоматически синхронизировать структуры данных между различными слоями приложения: API, клиентом, базой данных и схемами валидации.
Одним из базовых свойств Zod является возможность вывода TypeScript-типов напрямую из схем. Это не классическая кодогенерация в файловом смысле, но именно она формирует основу всей экосистемы:
import { z } from "zod";
const UserSchema = z.object({
id: z.string(),
name: z.string(),
age: z.number().optional(),
});
type User = z.infer<typeof UserSchema>;
Ключевой момент здесь заключается в том, что схема становится единым
источником правды. Тип User не поддерживается вручную — он
полностью выводится из Zod-описания. Это снижает дублирование и
исключает расхождения между runtime-валидацией и compile-time
типами.
При масштабировании проекта такие схемы начинают использоваться как входная точка для дальнейшей генерации:
Один из наиболее распространённых сценариев кодогенерации — преобразование внешних контрактов в Zod-схемы.
Существуют инструменты, преобразующие JSON Schema в Zod:
json-schema-to-zodjson-schema-to-zod-подобные генераторыПринцип работы заключается в маппинге стандартных JSON Schema конструкций:
| JSON Schema | Zod |
|---|---|
type: "string" |
z.string() |
type: "number" |
z.number() |
required |
обязательные поля объекта |
enum |
z.enum([...]) |
Пример результата генерации:
const Schema = z.object({
status: z.enum(["active", "disabled"]),
count: z.number(),
});
Такая генерация часто используется при интеграции с внешними сервисами, где контракт задаётся не в TypeScript.
Более сложный уровень кодогенерации связан с OpenAPI спецификациями.
Инструменты:
openapi-zod-client@asteasolutions/zod-to-openapiopenapi-typescript + кастомные трансформерыПроцесс включает два направления:
OpenAPI описывает структуры запросов и ответов, которые затем преобразуются в Zod:
User:
type: object
properties:
id:
type: string
email:
type: string
Результат:
const UserSchema = z.object({
id: z.string(),
email: z.string(),
});
Обратное направление позволяет использовать Zod как источник спецификации API:
import { z } from "zod";
import { extendZodWithOpenApi } from "@asteasolutions/zod-to-openapi";
extendZodWithOpenApi(z);
const UserSchema = z.object({
id: z.string().openapi({ example: "123" }),
email: z.string(),
});
Далее схема может быть преобразована в OpenAPI документ.
Такой подход делает Zod центральным элементом API-дизайна, а не только валидации.
Кодогенерация в связке Zod часто используется для построения типобезопасных клиентов.
Zodios реализует подход, при котором API описывается через Zod, а затем автоматически превращается в клиент:
const api = new Zodios("/api", [
{
method: "get",
path: "/users",
response: z.array(UserSchema),
},
]);
Генерация здесь выражается не в создании файлов, а в формировании строго типизированного runtime-клиента, где:
В экосистеме backend-разработки важное место занимает синхронизация базы данных и схем валидации.
Один из популярных подходов:
prisma-zod-generator
Пример Prisma модели:
model User {
id String @id
email String
age Int?
}
Генерация Zod:
export const UserSchema = z.object({
id: z.string(),
email: z.string(),
age: z.number().optional(),
});
Такая связка позволяет:
Несмотря на то, что Zod уже интегрирован с TypeScript через
z.infer, существуют инструменты расширенной генерации:
.d.ts файловИнструменты типа ts-to-zod позволяют преобразовывать
TypeScript интерфейсы в Zod-схемы:
interface User {
id: string;
email: string;
age?: number;
}
Результат:
const UserSchema = z.object({
id: z.string(),
email: z.string(),
age: z.number().optional(),
});
Такая трансформация применяется в случаях, когда:
В крупных проектах кодогенерация Zod часто встроена в сборочные пайплайны:
Типичный сценарий:
Хотя Zod не является нативной частью GraphQL, он часто используется как слой валидации поверх резолверов.
Инструменты генерации позволяют:
Подход часто применяется в архитектурах, где GraphQL рассматривается как транспорт, а Zod — как слой доменной валидации.
Zod-схемы выступают центральным контрактом:
Генерация происходит вокруг них, а не наоборот.
OpenAPI / Prisma / GraphQL
↓
Zod schemas
↓
TypeScript types
↓
API clients
Каждый слой может генерироваться независимо, но все они связаны через Zod.
Инструменты типа Vite или Webpack позволяют интегрировать генерацию Zod-схем в билд:
Несмотря на широкие возможности, существуют структурные ограничения:
Поэтому кодогенерация обычно дополняет, а не заменяет ручное проектирование схем.
В современных архитектурах часто применяется комбинированная модель:
Такой подход позволяет балансировать между контролем и автоматизацией, минимизируя расхождения между слоями системы.