5 pontos por asheswook 2025-12-24 | 2 comentários | Compartilhar no WhatsApp

Olá.

Em geral, ao desenvolver backends em TypeScript, vocês provavelmente já sabem que os pontos onde mais ocorrem erros são as partes de tempo de execução que não são capturadas em tempo de compilação.

Por exemplo, isso acontece com mais frequência em implementações de repositório que fazem parsing de linhas do banco de dados ou em partes de comunicação com APIs externas.

São situações em que o valor recebido do banco vem diferente do esperado e acaba sendo injetado como undefined em tempo de execução, ou em que, ao fazer casting, não se consegue identificar corretamente um valor primitivo vindo de fora, o que leva a erros humanos.

Mesmo ao implementar um repositório, é preciso ficar enchendo o código com tipos em interfaces para os valores primitivos vindos de fora. Talvez isso pareça um problema pequeno, mas eu criei isso para que fosse mais confortável de usar.

Na prática, o código das partes de API externa e das implementações de banco de dados ficou muito mais conciso, e os erros que acontecem em tempo de execução também diminuíram.

Depois de usar isso no backend da equipe e achar que ficou bom, publiquei no 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  

O exemplo acima supõe uma situação em que os dados são obtidos externamente. Pode ser aplicado usando axios, mysql2 ou postgres pg. A validação é feita sobre um valor recebido como tipo unknown e, se estiver correto, esse valor passa a ser tratado no fluxo de controle seguinte como o valor definido em validate() por meio de asserção (asserts).

Claro, também é possível usar uma biblioteca como zod.

A diferença entre zod e valdex é que o valdex não cria e usa um schema como instância; em vez disso, ele permite lidar com tipos de dados de forma declarativa diretamente no local onde os dados são recebidos. Não é necessário ficar indo e voltando no código para alterar uma interface ou modificar uma classe DTO.

npm i valdex  

Você pode instalar pelo npm e experimentar.

Github: https://github.com/asheswook/valdex

2 comentários

 
sunrabbit 2025-12-24

Parece que, pelo menos para tipos simples, isso deve oferecer uma DX realmente muito boa, hein.

 
asheswook 2025-12-24

Como ele oferece suporte a objetos aninhados e arrays, até agora não houve nada particularmente incômodo ao usá-lo na implementação de APIs externas ou de repositórios.
Obrigado pelo interesse!