Executando verificação de segurança...
6

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 caracteres o e i

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.

Carregando publicação patrocinada...
3
3

Sua dica é boa, mas seu texto me fez entender que o Zod veio para consertar alguma coisa no TypeScript?.

O Zod é apenas um auxiliar para o desenvolvedor lidar com os dados conforme os tipos definidos durante a produção, o mais incrível dele é como funciona incrivelmente bem com o TypeScript fazendo com que você não precise definir os tipos duas vezes, por exemplo, você pode criar você mesmo os tipos e validações, mas em algum momento você perceberá que está criando um tipo para produção e outro para execução, o Zod praticamente elimina isso e tem uma API extremamente útil para facilitar as validações.

1
2

Zod é muito bom mesmo, porem seu exemplo esta aceitando outras strings pois vc esta fazendo casting de tipo quando usa o "as", forcando um tipo:

'const a: IStdin['a'] = d.toString().trim() as IStdin['a']'

O definicao de tipos vem do developer, entao ele é responsavel por acertar e ter controle dos tipos. Para runtime sempre bom ter uma validacao, a vantagem de usar Zod em relacao com outros como Joi, Yup é que ele casa muito bem com typescript, ajudando assim no desenvolvimento.

1

é que sem o casting ele não executaria por conflito de tipos...
O problema é q o typescript n foi feito para verificações e sim para facilitar o desenvolvimento!

1

Entao por ter este conflito ele protege seu codigo. No caso vc nao consegue compilar seu codigo por conta do erro, sem compilar para JS e sem o bundle vc nao tem a aplicacao. Sendo assim é tarefa do Desenvolvedor identificar esses tipos errados e corrigi-los. Typescript ajuda a identificar os erros, quem deve trata-lo é o dev.

Como comentei anteriormente uso de Zod, Joi , Yup , etc sempre é bom. Porem o seu exemplo esta um pouco fora do contexto.