Aula 08 - Manipulação Avançada de Tipos 🧪
Subindo o Nível 🚀
- Hoje vamos além das interfaces simples.
- Veremos como o TS pode ser dinâmico e "mágico".
O operador keyof 🔑
- Extrai todas as chaves (nomes das propriedades) de um tipo.
type User = { id: number; nome: string };
type UserKeys = keyof User; // "id" | "nome"
keyof na Prática 🛠️
- Criar funções que acessam propriedades de objetos com garantia de que a chave existe.
Indexed Access Types 📂
- "Olhar" para o tipo de uma propriedade específica.
type NomeTipo = User["nome"]; // string
Conditional Types (Se/Então) ⚖️
- Tipos que decidem seu formato baseados em condições.
- Sintaxe:
T extends U ? X : Y.
Exemplo: Verificação de Tipo 🔍
type IsString<T> = T extends string ? "Sim" : "Não";
A palavra-chave infer 🕵️
- Capturar um tipo de "dentro" de outro durante uma checagem condicional.
type GetArrayType<T> = T extends (infer U)[] ? U : T;
Template Literal Types 🔠
- Criar uniões de strings dinâmicas usando crases.
type Evento = "click" | "hover";
type EventoDinamico = `on${Capitalize<Evento>}`;
// "onClick" | "onHover"
Manipulando Nomes de Propriedades ✍️
- Utilitários:
Uppercase, Lowercase, Capitalize, Uncapitalize.
Mapped Types Avançados 🗺️
- Mudar o nome das chaves durante a criação do tipo.
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K]
};
Recursividade em Tipos 🔁
- Um tipo pode chamar a si mesmo! (Cuidado com loops infinitos).
- Por baixo dos panos todos eles usam tipos condicionais.
Visualizando Lógica de Tipos 📊
graph TD;
T{T extends string?};
T -- Sim --> R1[Tipo: String];
T -- Não --> R2[Tipo: Outro];
Onde isso é usado? 💎
- Filtros de busca tipados automaticamente.
- Transformadores de dados complexos.
- Frameworks como NestJS e bibliotecas de Schema (Zod).
Por que aprender isso? 🏆
- Para construir ferramentas (libraries) que outros desenvolvedores usarão.
- Para entender as mensagens de erro mais cabulosas do TS.
Dica: Não abuse! 🛑
- Código de tipagem muito complexo pode ser tão difícil de manter quanto código de lógica complexa.
Deep Dive: infer 🌊
- Pense no
infer como uma variável temporária que o TS preenche para você.
Resumo 🏁
- keyof e Acesso Indexado
- Tipos Condicionais e infer
- Template Literal Types
Próxima Aula: Módulos e Organização!
Vamos organizar nosso caos. 🚀
Perguntas? ❓