Преобразование TypeScript в схему Zod — Numio
Генерирует схемы Zod из интерфейсов и типов TypeScript с помощью ts-to-zod. Каждый тип Foo становится экспортируемым fooSchema, а теги JSDoc вроде @format email или @minimum — валидаторами Zod.
Типы вашего API уже описаны интерфейсами TypeScript, и вы хотите проверять входящие запросы во время выполнения, не составляя схемы вручную.
Когда пригодится
- Типы вашего API уже описаны интерфейсами TypeScript, и вы хотите проверять входящие запросы во время выполнения, не составляя схемы вручную.
- Вы проверяете ввод форм через Zod и хотите, чтобы схема оставалась согласованной с общим типом TypeScript.
Как пользоваться
- Вставьте интерфейсы TypeScript или псевдонимы типов; добавьте теги JSDoc вроде @minimum 13 или @format email, чтобы получить валидаторы.
- В настройках включите Keep TSDoc Comments, чтобы перенести комментарии в результат, или Skip the creation of zod validators from JSDoc annotations, чтобы игнорировать теги.
- Исходный код конвертируется на сервере через /api/typescript-to-zod; скопируйте код, импортирующий z из "zod".
TypeScript
export interface Signup {
/**
* @format email
*/
email: string;
/**
* @minimum 13
* @maximum 120
*/
age: number;
plan: "free" | "pro";
referrer?: string | null;
createdAt: Date;
}Схемы Zod
import { z } from "zod"
export const signupSchema = z.object({
email: z.string().email(),
age: z.number().min(13).max(120),
plan: z.union([z.literal("free"), z.literal("pro")]),
referrer: z.string().optional().nullable(),
createdAt: z.date(),
})Подробности и ограничения
Страница отправляет ваши данные на серверный маршрут (/api/typescript-to-zod) для конвертации; они обрабатываются не только в браузере. API-маршруты Next.js по умолчанию принимают тело запроса размером до 1 МБ.
Конвертируются только типы. Экспортируемые функции и константы схем не порождают.
Если тип ссылается на тип, которого нет во вводе, конвертер сообщает об ошибке отсутствующей зависимости вместо генерации схемы.
Схемы упорядочиваются по зависимостям, поэтому тип, на который ссылаются, например Author, выводится раньше типа, который его использует.
FAQ
Как конвертируются необязательные поля и поля с null?
referrer?: string | null становится z.string().optional().nullable(); свойство с типом Author | null становится authorSchema.nullable().
Как обрабатывается Date?
Свойство Date становится z.date(), который принимает объекты Date, а не ISO-строки. Для JSON-ввода используйте z.coerce.date().
Почему появляется "Some schemas can't be generated due to direct or indirect missing dependencies"?
Тип ссылается на другой тип, которого нет во вставленном коде. Вставьте и типы, на которые идут ссылки.