Aula 3 – Aprendendo TypeScript na Prática: Tuplas, Enums e o Tipo any
Introdução
Quando começamos a estudar TypeScript vindo do JavaScript, uma das primeiras mudanças que notamos é o uso de tipos. O TypeScript adiciona uma camada de segurança e previsibilidade ao código, evitando muitos erros que só seriam percebidos durante a execução no JavaScript.
Essa aula faz parte de uma série voltada para desenvolvedores iniciantes que estão migrando para o TypeScript. Hoje, vamos aprender três conceitos fundamentais: Tuplas (Tuples), Enums e o tipo any. Esses recursos ajudam a controlar melhor os tipos de dados e tornam o código mais confiável e organizado.
Ao final desta leitura, você vai entender como usar cada um deles e em quais situações aplicá-los no seu dia a dia como desenvolvedor.
Ambiente de Prática
Antes de começar, você pode testar todos os exemplos no TypeScript Playground (https://www.typescriptlang.org/play).
Se preferir rodar localmente, siga estes passos simples:
- Crie uma pasta para o projeto.
- Execute
npm init -yno terminal para iniciar o projeto Node. - Instale o TypeScript com
npm install typescript -D. - Crie um arquivo
index.tse escreva o código nele. - Compile com
npx tsc index.tsou execute diretamente comnpx ts-node index.ts.
Com o ambiente pronto, BORA CODAR!!!
Parte 1: Tuplas (Tuples)
O que são Tuplas
Em JavaScript, os arrays podem conter elementos de qualquer tipo.
No TypeScript, as tuplas são uma forma especial de array onde sabemos exatamente quantos elementos existirão e qual será o tipo de cada um.
Uma tupla é ideal para representar estruturas fixas, como coordenadas, pares chave-valor ou retornos múltiplos de uma função.
Exemplo Básico
let pessoa: [string, number] = ["Guilherme", 20];
console.log(pessoa);
Explicação linha por linha:
let pessoa: [string, number]→ declaramos uma variável chamadapessoae informamos que ela será uma tupla com duas posições, a primeira do tipostringe a segunda do tiponumber.= ["Guilherme", 20]→ atribuimos valores que respeitam essa ordem.console.log(pessoa)→ imprime o conteúdo completo da tupla.
Se tentássemos inverter a ordem, TypeScript mostraria erro, pois o tipo de cada posição é fixo.
Elementos Opcionais
Podemos permitir que uma posição seja opcional usando ?.
let produto: [string, number?, boolean?];
produto = ["Mouse"];
produto = ["Teclado", 120];
produto = ["Monitor", 800, true];
Explicação:
- O segundo e o terceiro elementos são opcionais.
- Isso é útil quando a tupla representa informações que podem variar em quantidade, mas têm uma estrutura previsível.
Tuplas Somente Leitura
Se quisermos garantir que os valores da tupla não serão alterados, podemos usar readonly.
let coordenadas: readonly [number, number] = [10, 20];
// coordenadas[0] = 30; // Erro: tupla é somente leitura
Explicação:
- O
readonlyimpede qualquer modificação após a atribuição inicial. - Esse recurso é útil para representar dados imutáveis, como coordenadas geográficas ou posições fixas em um layout.
Quando Usar Tuplas
Use tuplas quando:
- A estrutura e a ordem dos dados são conhecidas.
- Você precisa representar pares ou conjuntos fixos.
- Há necessidade de garantir imutabilidade com
readonly.
Um exemplo real é o retorno de uma função que devolve mais de um valor:
function useState(): [number, (n: number) => void] {
let valor = 0;
function setValor(novo: number) {
valor = novo;
}
return [valor, setValor];
}
const [valor, setValor] = useState();
setValor(5);
Essa estrutura é semelhante ao padrão usado no React, que retorna uma tupla [estado, funçãoDeAtualização].
Parte 2: Enums
O que são Enums
Enums (de enumerations) permitem criar um conjunto de valores nomeados, facilitando a leitura e manutenção do código.
Eles não existem no JavaScript puro, mas o TypeScript os compila para um objeto equivalente.
Enums são úteis para representar opções fixas — como status, tipos de usuário ou categorias.
Enum Numérico
enum StatusPedido {
Pendente,
Enviado,
Entregue
}
let statusAtual: StatusPedido = StatusPedido.Enviado;
console.log(statusAtual);
Explicação:
- Criamos um
enumchamadoStatusPedido. - Os valores começam automaticamente em 0 (
Pendente = 0,Enviado = 1,Entregue = 2). - A variável
statusAtualrecebe o valorStatusPedido.Enviado. - No console, será exibido o número
1, correspondente ao valor do enum.
Enum de String
enum TipoUsuario {
Admin = "ADMIN",
Editor = "EDITOR",
Visitante = "VISITANTE"
}
let usuario: TipoUsuario = TipoUsuario.Editor;
console.log(usuario);
Explicação:
- Cada valor do enum é uma string literal.
- Enums de string são mais legíveis e geralmente preferidos em APIs e logs.
Enum Heterogêneo (apenas para conhecer)
Enums heterogêneos misturam números e strings, mas são pouco usados por dificultarem a leitura.
enum Exemplo {
A = 1,
B = "Texto"
}
Por Que Usar Enums
Enums tornam o código mais semântico e organizado, evitando erros de digitação e facilitando manutenção.
Exemplo prático:
function verificarAcesso(tipo: TipoUsuario) {
if (tipo === TipoUsuario.Admin) {
console.log("Acesso total permitido");
} else {
console.log("Acesso restrito");
}
}
verificarAcesso(TipoUsuario.Visitante);
Esse exemplo evita erros como comparar strings diretamente (if (tipo === "admin")) e garante consistência.
Parte 3: any e a Tipagem Fraca
O que é o Tipo any
O tipo any diz ao TypeScript para não verificar o tipo de uma variável.
É como dizer: “confie em mim, eu sei o que estou fazendo”.
Na prática, é o mesmo comportamento do JavaScript.
let valor: any = "Texto";
valor = 10;
valor = true;
Explicação:
- A variável
valorpode receber qualquer tipo. - Isso elimina os benefícios da tipagem estática do TypeScript.
O Perigo de Usar any
Usar any em excesso pode causar erros difíceis de identificar.
Imagine um projeto grande onde o tipo de uma variável muda sem aviso — o código pode quebrar sem que o TypeScript perceba.
Quando Usar any com Consciência
Há casos específicos em que any pode ser aceitável:
- Ao migrar código JavaScript antigo para TypeScript.
- Quando você ainda não sabe o formato exato de um dado externo (ex: resposta de uma API desconhecida).
Mas mesmo nesses casos, é melhor tentar usar unknown, que exige uma verificação de tipo antes do uso.
Exemplo Ruim
function calcular(x: any, y: any) {
return x + y;
}
console.log(calcular("5", 10)); // Resultado inesperado: 510
Explicação:
Sem tipos definidos, o TypeScript não impede que x e y sejam strings, resultando em concatenação em vez de soma.
Exemplo Melhor com Tipos
function calcular(x: number, y: number) {
return x + y;
}
console.log(calcular(5, 10)); // Saída correta: 15
Exemplo com unknown
let dado: unknown = "Olá";
if (typeof dado === "string") {
console.log(dado.toUpperCase());
}
Explicação:
Com unknown, o TypeScript exige uma verificação de tipo antes do uso, mantendo a segurança do código.
Conclusão
Hoje aprendemos três conceitos importantes do TypeScript: Tuplas, Enums e o tipo any.
As tuplas ajudam a definir estruturas fixas e previsíveis.
Os enums tornam o código mais legível e organizado.
E o tipo any, apesar de flexível, deve ser usado com cautela, pois remove a segurança da tipagem estática.
Agora é hora de praticar. Abra o Playground ou seu editor, teste cada exemplo, mude os valores e veja como o TypeScript reage. É assim que o aprendizado realmente se consolida.
🔗Repositório no Github: https:
github.com/guilherme-silvam/TS-aulas-guilhermemachadodev/tree/main/typescript-aula-3
Publicar comentário