valdex - una biblioteca de aserción de tipos en tiempo de ejecución para TypeScript fácil de usar
(github.com/asheswook)Hola.
En general, cuando desarrollas un backend en TypeScript, seguramente sabes que los puntos donde más errores ocurren son las partes de tiempo de ejecución que no se detectan en tiempo de compilación.
Por ejemplo, esto pasa con mayor frecuencia en implementaciones de repositorios que parsean filas de la base de datos o en las partes de comunicación con APIs externas.
Son casos donde el valor recibido desde la base de datos es distinto de lo esperado y en tiempo de ejecución se inyecta como undefined, o donde al hacer un casting no se identifica correctamente el valor primitivo que vino desde afuera y eso provoca errores humanos.
Incluso al implementar repositorios, hay que ir agregando tipos con interfaces para los valores primitivos que vienen del exterior. Puede parecer un problema menor, pero lo hice para que se pudiera usar de forma más cómoda.
En la práctica, el código de la parte de APIs externas y de las implementaciones de base de datos se volvió mucho más conciso, y también se redujeron los errores que ocurrían en tiempo de ejecución.
Después de usarlo en el backend del equipo y ver que funcionaba bien, lo publiqué en npm.
import { validate } from 'valdex';
const data: unknown = await fetchData();
validate(data, {
name: String,
age: Number,
active: Boolean
});
// TypeScript now knows the exact type of data
data.name // string
data.age // number
data.active // boolean
El ejemplo de arriba asume una situación en la que se obtienen datos desde el exterior. Se puede aplicar tanto si usas axios, mysql2 o postgres pg. Se valida el valor que llega con tipo unknown, y si es correcto, en el flujo de control posterior ese valor queda afirmado (asserts) como el definido en validate().
Por supuesto, también se puede usar una biblioteca como zod.
La diferencia entre zod y valdex es que valdex no crea ni usa el esquema como una instancia, sino que te permite manejar los tipos de datos de forma declarativa dentro del lugar donde recibes los datos. No hace falta estar subiendo y bajando por el código para modificar una interfaz o una clase DTO.
npm i valdex
Puedes instalarlo desde npm y probarlo.
2 comentarios
Parece que ofrece una DX excelente, al menos para tipos simples. Qué bien.
Como soporta tanto objetos anidados como arreglos, hasta ahora no ha habido nada que me moleste al implementarlo con APIs externas o repositorios.
¡Gracias por el interés!