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.