es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Haz que zod realice una comprobación de tipo de alto nivel en la entrada de .parse().

Entiendo que el objetivo de zod es analizar datos de entrada no confiables y afirmar que tienen un tipo que coincide con su esquema.

Pero generalmente esos datos llegan a través de API web que garantizan al menos su estructura de nivel superior, como “string” u “object”.

Parece que tendría sentido que zod realice esta comprobación de tipo de nivel superior en “parse()”, aunque solo sea para evitar errores tontos como los errores tipográficos. Pero, aparentemente, no lo hace.

A modo de ejemplo simplificado para ilustrar:

const schema = z.string().email();
schema.parse(1); // no hay error de tipo aquí - ¿por qué?

Parece que “parse(1)” debería generar un error de tipo en tiempo de compilación, porque sabemos que es imposible que el literal “number” 1 se valide correctamente en tiempo de ejecución. No podemos hacer eso con una entrada de “string” aleatoria, la validación en tiempo de ejecución para asegurarnos de que sea un correo electrónico válido es necesaria, pero un “number” aquí parece un error del programador obvio y ni siquiera debería compilar.

Un ejemplo más práctico, que me llevó a hacer esta pregunta:

async function validateRequest(request: Request) {
  const someSchema = z.object({ ... })
  return someSchema.parse(request.json()) // no se esperó la respuesta de request.json() así que no funcionará
}

Un error tonto como omitir el “await” anterior, parece que debería ser fácil de detectar mediante la verificación de “someSchema.parse()” de que le paso un “object”, no una “Promise“.

Entonces, ¿hay alguna manera de habilitar esta comprobación de tipo de nivel superior con zod?

¿O es este comportamiento intencional por alguna razón que no he comprendido sobre el diseño de zod?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Typescript y Zod, es cierto que el principal propósito de Zod es analizar datos de entrada no confiables y asegurarse de que coincida con el tipo de esquema. Sin embargo, parece carecer de verificación de tipo a nivel superior en parse() para evitar errores típicos de programadores como errores de escritura. Por ejemplo, const schema = z.string().email(); schema.parse(1); no arrojaría un error de tipo en tiempo de compilación, lo cual resulta confuso.

    Tendría sentido que Zod realice la verificación de tipo a nivel superior en parse(), al menos para identificar y prevenir este tipo de errores descuidados durante el tiempo de compilación. Si bien el análisis en tiempo de ejecución de Zod es necesario para las cadenas de texto, los números como el caso parse(1) son inválidos y podrían ser detectados durante la compilación.

    Además, en escenarios prácticos como async function validateRequest(request: Request), omitir un await podría enviar erróneamente una Promise<object> a Zod cuando requiere un object válido. Teniendo esto en cuenta, Zod podría agregar verificación de tipo a nivel superior para prevenir errores similares descuidados por parte de los programadores.

    Por lo tanto, es esencial confirmar si Zod tiene una forma de habilitar la verificación de tipo a nivel superior o si este comportamiento es intencional. Se puede encontrar más información en la página de GitHub de Zod.

Comments are closed.