Tipagem nominal no TS
O Typescript é um sistema de tipo estrutural em sua grande parte
Pra mim isso foi um contraste enorme com o que eu conhecia em outras linguagens de programação. No Java, se tem duas classes com a mesma estrutura, elas não são intercambiáveis por padrão. É necessário criar uma interface entre elas.
Estamos usando estruturas pra descrever o tipo. Isso é ótimo porque flexibiliza o typescript pra ficar próximo ao js
O enum é um ponto fora da curva, mesmo tendo o mesmo valor literal, ele não é considerado o mesmo tipo
Eu tenho meus pontos contra enum, mas eu considero que esse tipo de tipagem (nominal) tem seu valor no ts aonde ele não consegue chegar.
Por exemplo, a tipagem de email em aplicações por aí geralmente é frágil e permite qualquer string
TS se preocupa somente com tipar os valores primitivos, mas é possível usar tipagem nominal pra granular mais os valores.
No ts, temos uma técnica chamada de Branded Type.
E junto com essa tipagem, podemos colocar um type guard que valida o email
O tipo Brand pode ser implementado assim:
Podemos aproveitar essas características pra forçar a validação de diversos tipos valores no nosso fluxo de dados, seja email, uuid, datas etc. É uma ótima forma de combinar tipagem com runtime.
Mais sobre:
- Issue de suporte a nominals no TS
- Branded Types no Egghead e no Learning Typescript