Tecnologias/01 - Linguagens/02 - TypeScript2 min
TypeScript
Definição
TypeScript acrescenta um sistema de tipos estáticos ao JavaScript. Ele verifica a
compatibilidade entre valores e operações antes da execução: uma função que recebe
number pode rejeitar uma chamada que passe string.
JavaScript continua definindo o comportamento do programa em execução: objetos, funções, coerções, exceções e Promises seguem suas regras. TypeScript ajuda a detectar inconsistências nos contratos declarados. Referência: Handbook.
Verificação e execução
Anotações como : number, interfaces e aliases de tipos são apagadas na transformação
para JavaScript. O ambiente executa o código resultante. Alguns ambientes também
aceitam certos arquivos TypeScript diretamente, removendo a sintaxe de tipos;
essa remoção, sozinha, não equivale à verificação estática.
function subtotal(preco: number, quantidade: number): number {
return preco * quantidade;
}
console.log(subtotal(12, 3)); // 36
O JavaScript correspondente não precisa das anotações:
function subtotal(preco, quantidade) {
return preco * quantidade;
}
Declarar um tipo não acrescenta automaticamente um if para conferir argumentos.
Por isso, dados recebidos de uma API ainda exigem validação. Referência: The Basics.
Inferência
O compilador consegue deduzir tipos a partir dos valores e do contexto. Em
let total = 10, ele infere number. Anotar explicitamente é útil para tornar o
contrato de uma função ou objeto visível, mesmo quando a inferência seria suficiente.
Limitações
A verificação trabalha com as informações disponíveis. Um tipo declarado incorretamente,
uma biblioteca com definições imprecisas ou o uso de any pode deixar um erro passar.
O código também pode compilar e estar logicamente errado: multiplicar pelo desconto
errado é um erro de regra de negócio, mesmo que todos os valores sejam números.
Aprofundamento aplicado
Modelar o domínio antes de anotar variáveis
Considere uma API que calcula frete. peso: number impede passar texto, mas aceita
-4, NaN e um valor em gramas quando a função espera quilogramas. O tipo primitivo
representa a forma do dado; a regra do domínio precisa restringir os valores e a unidade.
Uma sequência útil é: receber unknown, validar, converter para uma representação
interna e executar a regra. Isso concentra suposições nas fronteiras e simplifica o núcleo.
| Etapa | Exemplo de erro detectado |
|---|---|
| Verificação estática | Chamar a função com um objeto sem pesoKg |
| Validação de entrada | Receber peso negativo ou não finito |
| Teste de domínio | Aplicar a faixa de frete errada para 10 kg |
| Integração | Transportadora responder em unidade diferente |
Acesso a coleções também pode falhar
Com noUncheckedIndexedAccess, uma leitura como valores[0] considera a possibilidade
de não existir elemento. Isso obriga a decidir o comportamento do array vazio.
Essa opção é separada de strict.
Documentação da opção.
Exercício: descreva o contrato de uma função de média. Para a entrada vazia,
escolha explicitamente erro ou ausência de resultado. Resultado esperado: o contrato
não promete um número utilizável quando a divisão produziria NaN.
Relacionado: 3. Tipos, Interfaces e Objetos em TypeScript · 8. Validação de Dados em TypeScript.
Parte de TypeScript