Códecs
✨ Nuevo — Introducido en [email protected]
Todos los esquemas de Zod pueden procesar entradas tanto en dirección hacia adelante como hacia atrás:
- Hacia adelante:
InputaOutput.parse().decode()
- Hacia atrás:
OutputaInput.encode()
En la mayoría de los casos, esta es una distinción sin diferencia. Los tipos de entrada y salida son idénticos, por lo que no hay diferencia entre "hacia adelante" y "hacia atrás".
Sin embargo, algunos tipos de esquemas hacen que los tipos de entrada y salida diverjan, notablemente z.codec(). Los códecs son un tipo especial de esquema que define una transformación bidireccional entre otros dos esquemas.
En estos casos, z.decode() y z.encode() se comportan de manera bastante diferente.
Nota — No hay nada especial sobre las direcciones o la terminología aquí. En lugar de codificar con un códec A -> B, podrías decodificar con un códec B -> A. El uso de los términos "decode" y "encode" es solo una convención.
Esto es particularmente útil cuando se analizan datos en un límite de red. Puedes compartir un solo esquema de Zod entre tu cliente y servidor, y luego usar este único esquema para convertir entre un formato amigable para la red (digamos, JSON) y una representación de JavaScript más rica.
Componibilidad
Nota — Puedes usar z.encode() y z.decode() con cualquier esquema. No tiene que ser un ZodCodec.
Los códecs son un esquema como cualquier otro. ¡Puedes anidarlos dentro de objetos, matrices, tuberías (pipes), etc. No hay reglas sobre dónde puedes usarlos!
Entradas con seguridad de tipos
Aunque .parse() y .decode() se comportan de manera idéntica en tiempo de ejecución, tienen firmas de tipo diferentes. El método .parse() acepta unknown como entrada, y devuelve un valor que coincide con el tipo de salida inferido del esquema. Por el contrario, las funciones z.decode() y z.encode() tienen entradas fuertemente tipadas.
¿Por qué la diferencia? Codificar y decodificar implican transformación. En muchos casos, las entradas a estos métodos ya están fuertemente tipadas en el código de la aplicación, por lo que z.decode/z.encode aceptan entradas fuertemente tipadas para mostrar errores en tiempo de compilación.
Aquí hay un diagrama que demuestra las diferencias entre las firmas de tipo para parse(), decode() y encode().


Variantes asíncronas y seguras
Al igual que con .transform() y .refine(), los códecs soportan transformaciones asíncronas.
Al igual que con el parse() regular, existen variantes "seguras" y "asíncronas" de decode() y encode().
Cómo funciona la codificación
Hay algunas sutilezas en cómo ciertos esquemas de Zod "invierten" su comportamiento de análisis.
Códecs
Este se explica por sí mismo. Los códecs encapsulan una transformación bidireccional entre dos tipos. z.decode() activa la transformación decode para convertir la entrada en un valor analizado, mientras que z.encode() activa la transformación encode para serializarlo de nuevo.
Tuberías (Pipes)
Dato curioso — Los códecs se implementan internamente como una subclase de tuberías que han sido aumentadas con lógica de transformación "intersticial".
Durante la decodificación regular, un esquema ZodPipe<A, B> primero analizará los datos con A, luego los pasará a B. Como era de esperar, durante la codificación, los datos se codifican primero con B, luego se pasan a A.
Refinamientos
Todas las comprobaciones (.refine(), .min(), .max(), etc.) se ejecutan en ambas direcciones.
Para evitar errores inesperados en tu lógica personalizada de .refine(), Zod realiza dos "pasadas" durante z.encode(). La primera pasada asegura que el tipo de entrada se ajuste al tipo esperado (sin errores invalid_type). Si eso pasa, Zod realiza la segunda pasada que ejecuta la lógica de refinamiento.
Este enfoque también soporta "transformaciones mutantes" como z.string().trim() o z.string().toLowerCase():
Valores predeterminados y prefaults
Los valores predeterminados (defaults) y prefaults solo se aplican en la dirección "hacia adelante".
Cuando adjuntas un valor predeterminado a un esquema, la entrada se vuelve opcional (| undefined) pero la salida no. Como tal, undefined no es una entrada válida para z.encode() y los defaults/prefaults no se aplicarán.
Catch
De manera similar, .catch() solo se aplica en la dirección "hacia adelante".
Stringbool
Nota — Stringbool es anterior a la introducción de códecs en Zod. Desde entonces ha sido reimplementado internamente como un códec.
La API z.stringbool() convierte valores de cadena ("true", "false", "yes", "no", etc.) en boolean. Por defecto, convertirá true a "true" y false a "false" durante z.encode().
Si especificas un conjunto personalizado de valores truthy y falsy, se usará el primer elemento en la matriz en su lugar.
Transformaciones
⚠️ — La API .transform() implementa una transformación unidireccional. Si existe algún .transform() en cualquier lugar de tu esquema, intentar una operación z.encode() arrojará un error en tiempo de ejecución (no un ZodError).
Códecs útiles
A continuación se presentan implementaciones para un grupo de códecs comúnmente necesarios. Por el bien de la personalización, estos no se incluyen como APIs de primera clase en Zod mismo. En su lugar, debes copiarlos/pegarlos en tu proyecto y modificarlos según sea necesario.
Nota — Todas estas implementaciones de códecs han sido probadas para su corrección.
stringToNumber
Convierte representaciones de cadena de números al tipo number de JavaScript usando parseFloat().
stringToInt
Convierte representaciones de cadena de enteros al tipo number de JavaScript usando parseInt().
stringToBigInt
Convierte representaciones de cadena al tipo bigint de JavaScript.
numberToBigInt
Convierte el tipo number de JavaScript al tipo bigint.
isoDatetimeToDate
Convierte cadenas de fecha y hora ISO a objetos Date de JavaScript.
epochSecondsToDate
Convierte marcas de tiempo Unix (segundos desde la época) a objetos Date de JavaScript.
epochMillisToDate
Convierte marcas de tiempo Unix (milisegundos desde la época) a objetos Date de JavaScript.
json(schema)
Analiza cadenas JSON en datos estructurados y los serializa de nuevo a JSON. Esta función genérica acepta un esquema de salida para validar los datos JSON analizados.
Ejemplo de uso con un esquema específico:
utf8ToBytes
Convierte cadenas UTF-8 a matrices de bytes Uint8Array.
bytesToUtf8
Convierte matrices de bytes Uint8Array a cadenas UTF-8.
base64ToBytes
Convierte cadenas base64 a matrices de bytes Uint8Array y viceversa.
base64urlToBytes
Convierte cadenas base64url (base64 segura para URL) a matrices de bytes Uint8Array.
hexToBytes
Convierte cadenas hexadecimales a matrices de bytes Uint8Array y viceversa.
stringToURL
Convierte cadenas URL a objetos URL de JavaScript.
stringToHttpURL
Convierte cadenas URL HTTP/HTTPS a objetos URL de JavaScript.
uriComponent
Codifica y decodifica componentes URI usando encodeURIComponent() y decodeURIComponent().

