Convierte interfaces y types de TypeScript a schemas de Zod automáticamente
Alcance: Esta herramienta convierte los tipos más comunes mediante análisis de patrones — no es un compilador de TypeScript completo. Funciona correctamente para la gran mayoría de interfaces de APIs y modelos de datos.
Tipos soportados
Tipos no reconocidos se convierten a z.unknown() con un comentario. Los index signatures ([key: string]: T) y los métodos se omiten.
También podrías necesitar
Zod es la librería de validación de esquemas más popular del ecosistema TypeScript, con más de 30 millones de descargas semanales en npm. Su principal ventaja es que los tipos TypeScript se infieren directamente del schema — una única fuente de verdad que sirve tanto para validación en runtime como para tipado estático. Sin embargo, cuando ya tenés interfaces TypeScript existentes (de una API, un ORM o código legado), reescribirlas como schemas Zod manualmente es tedioso y propenso a errores. Esta herramienta automatiza esa conversión: analiza la estructura de tus interfaces usando análisis de patrones y genera el schema Zod equivalente. Funciona correctamente para la gran mayoría de interfaces de dominio: primitivos (string, number, boolean, Date), propiedades opcionales con ?, arrays en formato Type[] y Array<Type>, unions A | B, nullable con Type | null, objetos anidados, literales de string y número, y utilitarios como Record, Partial y Readonly. El output incluye tanto la definición del schema (z.object) como el tipo inferido (type Foo = z.infer<typeof fooSchema>), lista para copiar directamente en tu proyecto. Nota: al ser una herramienta de análisis de patrones y no un compilador TypeScript completo, los tipos genéricos complejos o las construcciones avanzadas del type system se convierten a z.unknown() con un comentario explicativo.
¿Qué es Zod y por qué usarlo con TypeScript?
Zod es una librería de validación de esquemas con inferencia de tipos para TypeScript. La diferencia clave vs. otras librerías es que con Zod definís el schema UNA vez y obtenés tanto la validación en runtime como el tipo TypeScript automáticamente con z.infer. Esto elimina la duplicación típica de definir primero una interface TypeScript y luego una clase de validación separada. Zod es el estándar en el ecosistema Next.js y tRPC, y se integra con React Hook Form, Astro, NestJS y muchos otros frameworks.
¿Qué tipos soporta la conversión?
Los tipos soportados son: primitivos (string, number, boolean, Date, null, undefined, any, unknown, never, void, bigint, symbol), opcionales con ? (→ .optional()), arrays Type[] y Array<Type>, unions A | B con detección automática de nullable (Type | null → .nullable()) y optional (Type | undefined → .optional()), objetos anidados inline, tuplas [A, B, C], literales de string, número y boolean, y utilitarios Record<K,V>, Partial<T>, Required<T> y Readonly<T>. Los tipos no reconocidos se convierten a z.unknown() con un comentario indicando el tipo original.
¿Por qué algunos tipos aparecen como z.unknown()?
Esta herramienta usa análisis de patrones (regex + parsing sintáctico) en lugar de compilar TypeScript completo. Los tipos que no puede resolver automáticamente son: tipos genéricos personalizados (MyGeneric<T>), tipos condicionales (T extends U ? A : B), mapped types ({ [K in keyof T]: ... }), tipos de utilidad avanzados (Omit, Pick, Exclude, Extract), y referencias a otros tipos/interfaces que no están definidos en el mismo bloque de entrada. Para estos casos, z.unknown() actúa como placeholder que podés reemplazar manualmente.
¿Puedo pegar múltiples interfaces a la vez?
Sí. Si pegás múltiples interfaces en el input, la herramienta las procesa todas y genera un schema separado para cada una. Los schemas se separan con líneas en blanco para mayor legibilidad. Sin embargo, las referencias entre interfaces (una interface que usa el tipo de otra) se resolverán como z.unknown() ya que el converter no construye un grafo de dependencias. Para esos casos, convertí las interfaces de adentro hacia afuera: primero la más básica, luego las que dependen de ella.
¿Cómo agrego validaciones adicionales como .min() o .email() al schema generado?
El schema generado es un punto de partida que podés extender con métodos de refinamiento de Zod. Por ejemplo, si el output dice email: z.string() y sabés que es un email, cambialo a z.string().email(). Para número con rango: z.number().min(0).max(100). Para string con longitud: z.string().min(1).max(255). Para URL: z.string().url(). Zod tiene docenas de refinadores para casos específicos — el schema generado por esta herramienta crea la estructura base que luego refinás con la semántica de tu dominio.