Generics | Typescript
- Generics | Typescript
Introdução
Generics no TypeScript permitem criar componentes reutilizáveis que funcionam com diversos tipos, mantendo segurança de tipos. Eles ajudam a escrever funções, classes e interfaces mais flexíveis sem perder informações sobre os tipos usados.
Por que usar Generics?
- Reutilização: permite escrever funções e estruturas que funcionam para vários tipos.
- Segurança: evita o uso de
any, mantendo o TypeScript capaz de detectar erros. - Clareza: ajuda a expressar intenções de forma mais explícita.
Sintaxe Básica
O formato mais comum é usar <T> para representar um tipo genérico.
function identidade<T>(valor: T): T {
return valor;
}
Aqui, T representa o tipo do parâmetro e do valor retornado.
Uso
identidade("texto"); // T = string
identidade(10); // T = number
Generics em Funções
Também é possível declarar múltiplos tipos genéricos.
function par<A, B>(a: A, b: B) {
return { a, b };
}
Generics em Interfaces
interface Caixa<T> {
valor: T;
}
const caixaString: Caixa<string> = { valor: "Olá" };
const caixaNumero: Caixa<number> = { valor: 42 };
Generics em Classes
class Lista<T> {
private itens: T[] = [];
adicionar(item: T) {
this.itens.push(item);
}
obterTodos(): T[] {
return this.itens;
}
}
Restrições (Constraints)
Você pode restringir o tipo genérico para aceitar apenas tipos que satisfaçam uma condição.
function logComprimento<T extends { length: number }>(item: T): void {
console.log(item.length);
}
Tipos Genéricos Padrão (Default Types)
interface Resposta<T = string> {
valor: T;
}
const r1: Resposta = { valor: "ok" }; // T = string
keyof e Generics
function pegarPropriedade<T, K extends keyof T>(obj: T, chave: K) {
return obj[chave];
}
pegarPropriedade({ nome: "Ana", idade: 20 }, "nome");