Você não viverá sem o ZOD 🧰
Ao usarmos interfaces elas são seguidas a risca em produção? Por qual motivo isso seria essencial para manter a segurança de um projeto, que ferramenta milagrosa é essa que resolverá todos os meus problemas?
TypeScript é uma farsa?
No TypeScript é possível observar que ele não valida se o valor recebido é exatamente o presente na interface, ele simplesmente delega esse processo de validação para o developer.
Como, por exemplo, na foto a cima foi criado uma interface IStdin que a possui um atributo
a
cujo valor somente poderia ser'oi'
, porém o usuário escreveu outras coisas no input gerando essa grande inconsistência!
Mas por que isso ocorre 🤔
O TypeScript cumpre o seu papel muito bem como um devx (Development Experience), mas quando rodamos o código ele é inteiramente compilado para JavaScript o que pode acabar deixando algumas inconsistências caso o nosso caro developer não se atentar em criar essas validações!
E a segurança, como fica 🕵️
Nesses casos é necessário criar verificações de tipo e valor dos dados provenientes de inputs, já que o JavaScript não traz isso por padrão e muito menos facilita algo neste sentido.
var stdin = process.openStdin();
interface IStdin {
a: 'oi'
}
stdin.addListener("data", function(d) {
// note: d is an object, and when converted to a string it will
// end with a linefeed. so we (rather crudely) account for that
// with toString() and then substring()
const a: IStdin['a'] = d.toString().trim() as IStdin['a']
if(a === 'oi')
console.log("you entered: [" + a + "]");
});
O JavaScript é uma linguagem de programação que não possui tipos de variáveis, ou seja, a validação desses tipos é delegado ao developer!
E Agora pequeno gafanhoto 🦗🖖 como o zod facilita isso?
Com o zod em mãos 🤚 podemos fazer diversas verificações e simultaneamente estar criando um tipo de dados, de forma que além de estarmos criando tipagens para o momento de desenvolvimento, também estamos criando-as para o momento de produção, com suas validações.
import zod from 'zod'
var stdin = process.openStdin();
const StdinSchema = zod.object({
a: zod.string().regex(/^[o]+[i]$/)
})
type IStdin = zod.infer<typeof StdinSchema>
stdin.addListener("data", function(d) {
// note: d is an object, and when converted to a string it will
// end with a linefeed. so we (rather crudely) account for that
// with toString() and then substring()
const { a } = StdinSchema.parse({ a: d.toString().trim() })
console.log("you entered: [" + a + "]");
});
Como neste casso verificamos por meio de um regex (expressão regular) se o atributo
a
possui os caractereso
ei
Caso você tenha amado o zod e não conseguirá mais viver sem ele, recomendo fortemente ler a sua documentação para entender mais sobre suas vastas funcionalidades, as quais vão desde validações em produção até uma ótima integração com o TypeScript que permite um desenvolvimento veloz e agradável.