Tipos primitivos e a inferência automática
Você nem sempre precisa escrever o tipo à mão. Na maior parte do tempo, o TypeScript já sabe qual é, só olhando o valor.
Estudar esta lição interativa →Na lição passada você anotou tipos à mão, com : string, : number e companhia. Isso é útil, mas escrever essa anotação em toda variável do seu código seria cansativo, e na prática ninguém faz isso o tempo todo. O TypeScript tem um recurso que resolve boa parte disso sozinho: a inferência de tipos.
Quando você cria uma variável já atribuindo um valor, o TypeScript olha esse valor inicial e deduz o tipo por conta própria, sem você precisar escrever nada. A partir daí, ele passa a proteger essa variável exatamente como se você tivesse anotado o tipo à mão. Rode o exemplo:
// O TypeScript INFERE o tipo a partir do valor inicial, mesmo sem anotação:
let cidade = "Porto Alegre"; // inferido como string
console.log(cidade);
cidade = 42; // erro: number não pode ir onde só cabe stringNenhuma anotação de tipo aqui, e ainda assim o diagnóstico aparece.
Repare bem: em nenhum momento você escreveu : string na variável cidade. Mesmo assim, o TypeScript recusou cidade = 42. Ele olhou o valor inicial ("Porto Alegre", um texto) e concluiu, sozinho, que aquela variável é do tipo string dali em diante. É como se cada variável, ao nascer com um valor, já saísse etiquetada.
Pense num funcionário novo de uma loja que, ao ver a primeira caixa que você trouxe cheia de parafusos, já conclui "ah, esta prateleira é dos parafusos" e passa a recusar qualquer outra coisa que você tente colocar ali. Ninguém precisou escrever uma etiqueta explícita; o próprio conteúdo inicial definiu a regra.
Isso levanta uma pergunta prática: se a inferência já faz o trabalho, quando vale a pena anotar o tipo explicitamente? A resposta mais comum, usada por times profissionais: deixe a inferência trabalhar em variáveis locais simples, e reserve a anotação explícita para os casos em que o tipo não pode ser adivinhado de cara (parâmetros de função, por exemplo, chegam sem valor inicial) ou quando anotar deixa a intenção do código mais clara para quem for ler depois:
// Às vezes vale anotar mesmo quando o TypeScript já inferiria sozinho,
// para deixar a intenção clara para quem lê o código depois:
let temperatura: number = 21.5;
let cidade: string = "Curitiba";
let chovendo: boolean = false;
console.log(`Em ${cidade}, ${temperatura}°C. Chuva: ${chovendo}`);Aqui a anotação é opcional, mas ajuda a documentar a intenção.
Se você criar uma variável já com um valor óbvio (let total = 0, let nome = "Ana"), deixe a inferência cuidar do tipo. Anote explicitamente quando a variável nasce sem valor (let resultado: number;, para preencher depois) ou quando o formato é complexo o bastante para merecer ficar documentado por escrito.
// Sua vez! A variável "desconto" está recebendo um texto, mas devia
// guardar um número (a porcentagem de desconto). Troque o valor para
// um number de verdade e observe o diagnóstico desaparecer.
let desconto: number = "10";
console.log(`Desconto de ${desconto}%`);Troque o valor até o diagnóstico sumir.