Diferença entre "any" e "unknown" no Typescript
Já se perguntou qual a diferença entre any e unknown no Typescript? E porque elas são tão parecidas, já que teóricamente aceitam qualquer tipo.
Se já teve essa dúvida, deixa eu esclarecer ela para vocês.
Any vs Unknown
No TypeScript, unknown e any são tipos que permitem o uso flexivél no tipo de dados que uma variável pode armazenar, entretanto, ambas tem diferenças entre si bastante importantes:
any:
- É o tipo mais flexível em TypeScript.
- Uma variável do tipo any pode armazenar qualquer tipo de dado e TypeScript não realiza verificação de tipo nem oferece IntelliSense para essas variáveis.
- É útil quando você está migrando código existente para TypeScript ou quando o tipo exato é desconhecido ou não importa para o contexto.
unknown:
- É mais restritivo que any.
- Uma variável do tipo unknown também pode armazenar qualquer tipo de dado, mas você deve realizar uma verificação de tipo antes de utilizá-la de forma segura.
- TypeScript requer que você faça uma verificação de tipo (como typeof, instanceof, ou comparações) antes de poder operar com segurança em variáveis do tipo unknown.
- É útil quando você quer garantir que o tipo seja verificado antes de usá-lo, adicionando uma camada de segurança em comparação ao uso de any.
Exemplos de uso:
Usando o any:
1 let usandoAny: any;
2
3 usandoAny = 10;
4 console.log(usandoAny.toFixed(2))
5
6 usandoAny = "Olá TypeScript";
7 console.log(usandoAny.toUpperCase());
Neste exemplo, a variável usandoAny pode armazenar qualquer tipo de dado sem restrições. Não há verificação de tipo, então toFixed() e toUpperCase() são chamados diretamente, independentemente do tipo atual da variável usandoAny.
Usando o unknown:
1 let usandoUnknown: unknown;
2
3 usandoUnknown = 10;
4 console.log(usandoUnknown.toFixed(2)); // Erro: Object is of type 'unknown'
5
6 usandoUnknown = "Olá TypeScript";
7 if (typeof usandoUnknown === 'string') {
8 console.log(usandoUnknown.toUpperCase());
9 }
Já nesse exemplo, a variável usandoUnknow pode armazenar qualquer tipo de dado, mas o TypeScript não permite acessar propriedades ou métodos diretamente sobre ele sem verificar primeiro o tipo. No caso do string, é necessário fazer uma verificação de tipo (typeof) antes de usar toUpperCase(), garantindo assim que TypeScript saiba que usandoUnknow é realmente uma string antes de tentar chamar o método toUpperCase().
Considerações finais
any é menos seguro porque permite qualquer tipo sem restrições ou verificação.
unknown é mais seguro porque requer uma verificação de tipo antes de poder ser usado de forma segura.
Concluindo, se você puder evitar any em favor de unknown e fazer uma verificação de tipo antes de usá-lo, geralmente é uma prática melhor para garantir a segurança e a clareza do código em TypeScript.