Pular para conteúdo

Aula 06 - Generics (Programação Genérica) 📦


O que são Generics? 🧬

  • Componentes que funcionam com vários tipos de dados.
  • Mantêm a segurança sem usar any.

O Problema do any 🌪️

  • Perdemos o autocompletar.
  • O TypeScript para de nos proteger.

A Sintaxe <T> ✍️

  • O Diamante (Diamond Operator).
  • "T" representa um tipo que será definido depois.

Exemplo: Função Genérica 📞

function Identity<T>(arg: T): T {
    return arg;
}

Como usar Generics 🛠️

  1. Especificando o tipo: Identity<string>("Olá").
  2. Deixando o TS inferir: Identity(10).

Generics em Arrays 📚

  • Já vimos isso: Array<string> é um Generic!

Múltiplos Tipos Genéricos 👥

  • Podemos ter mais de um.
  • <T, U, K>.
function par<T, U>(a: T, b: U) { ... }

Generic Constraints (Restrições) ⛓️

  • Limitar quais tipos podem ser usados.
  • Usamos a palavra-chave extends.

Exemplo: Restrição de Propriedade 🛡️

interface PossuiLength { length: number; }

function logSize<T extends PossuiLength>(arg: T) {
    console.log(arg.length);
}

Classes Genéricas 🏗️

  • Criar moldes que se adaptam ao dado neles guardado.
class Caixa<T> {
    constructor(public conteudo: T) {}
}

Interfaces Genéricas 🧩

  • Muito comum para respostas de servidores.
interface Resposta<T> {
    data: T;
    error: string | null;
}

Generics com Valor Padrão 🎁

  • Podemos definir um tipo "default".
interface Config<T = string> { ... }

Por que usar Generics? 💎

  • Reutilização de código masiva.
  • Tipagem 100% segura.
  • Menos código duplicado.

Onde encontramos Generics? 🕵️

  • Bancos de dados (Prisma, TypeORM).
  • Consumo de APIs (Axios).
  • Hooks do React (useState<User>()).

Visualizando Generics 📊

graph LR;
    Func[Função Genérica] -- "Passa String" --> Res1[Retorna String];
    Func -- "Passa Number" --> Res2[Retorna Number];
    style Func fill:#f9f,stroke:#333

Boas Práticas ✍️

  • Não use Generics se não for necessário (KISS).
  • Use nomes curtos como T, U, V ou descriptivos como TData, TResponse.

Erros Comuns ❌

  • Tentar usar métodos específicos de um tipo (ex: .toUpperCase()) sem antes de fazer a restrição com extends.

Generics vs Unions ⚖️

  • Unions: Aceita A ou B.
  • Generics: "Prende" o tipo do início ao fim da execução.

Resumo 🏁

  • Conceito de Generics
  • Constraints (extends)
  • Classes e Interfaces Genéricas

Próxima Aula: Utility Types!

Vamos manipular tipos como magos. 🚀


Perguntas? ❓