Pular para o conteúdo

Converter TypeScript em esquema Zod — Numio

Gera schemas Zod a partir de interfaces e tipos TypeScript com ts-to-zod. Cada tipo Foo vira um fooSchema exportado, e tags JSDoc como @format email ou @minimum viram validadores Zod.

Os tipos da sua API já existem como interfaces TypeScript e você quer validar em tempo de execução as requisições recebidas sem escrever schemas à mão.

TypeScript

Zod Schema

Quando usar

  • Os tipos da sua API já existem como interfaces TypeScript e você quer validar em tempo de execução as requisições recebidas sem escrever schemas à mão.
  • Você valida entradas de formulário com Zod e quer que o schema continue consistente com o tipo TypeScript compartilhado.

Como usar

  1. Cole interfaces ou aliases de tipo TypeScript; adicione tags JSDoc como @minimum 13 ou @format email para obter validadores.
  2. Nas configurações, ative Keep TSDoc Comments para copiar os comentários para a saída, ou Skip the creation of zod validators from JSDoc annotations para ignorar as tags.
  3. O código-fonte é convertido no servidor via /api/typescript-to-zod; copie o código que importa z de "zod".

TypeScript

export interface Signup {
  /**
   * @format email
   */
  email: string;
  /**
   * @minimum 13
   * @maximum 120
   */
  age: number;
  plan: "free" | "pro";
  referrer?: string | null;
  createdAt: Date;
}

Schemas 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(),
})

Detalhes e limitações

A página envia sua entrada para uma rota do servidor (/api/typescript-to-zod) para conversão; ela não é processada apenas no navegador. As rotas de API do Next.js aceitam por padrão corpos de requisição de até 1 MB.

Só tipos são convertidos. Funções e constantes exportadas não geram schema.

Se um tipo referencia um tipo que não está na entrada, o conversor reporta um erro de dependência ausente em vez de emitir um schema.

Os schemas são ordenados por dependência, então um tipo referenciado como Author é emitido antes do tipo que o usa.

FAQ

Como campos opcionais e null são convertidos?

referrer?: string | null vira z.string().optional().nullable(); uma propriedade do tipo Author | null vira authorSchema.nullable().

Como Date é tratado?

Uma propriedade Date vira z.date(), que aceita objetos Date, não strings ISO. Use z.coerce.date() para entrada JSON.

Por que recebo "Some schemas can't be generated due to direct or indirect missing dependencies"?

Um tipo referencia outro tipo que não está no código colado. Cole também os tipos referenciados.

Especificações e referências