TypeScript Genéricos Intermediário
Constraints genéricas
Em TypeScript, constraints genéricas permitem restringir os tipos que podem ser usados como argumentos de tipo. Usando a palavra-chave extends, você pode exigir que um tipo genérico tenha certas propriedades ou seja compatível com outro tipo. Isso torna o código mais seguro e expressivo, evitando erros em tempo de compilação.
Além de extends, o operador keyof extrai as chaves de um tipo, e o acesso indexado (T[K]) obtém o tipo de uma propriedade específica. Com múltiplos parâmetros genéricos, você pode criar funções e classes que relacionam tipos de forma flexível e precisa.
Neste card, você vai aprender a aplicar constraints para escrever funções genéricas que só aceitam tipos com determinadas características, garantindo que operações como acessar propriedades sejam válidas. Isso é essencial para bibliotecas e código reutilizável.
Pontos-chave
extendsem genéricos restringe os tipos aceitos, permitindo acessar membros com segurança.keyof Tproduz uma união literal dos nomes das propriedades deT.- O acesso indexado
T[K]obtém o tipo da propriedadeKemT. - Múltiplos parâmetros genéricos permitem relacionar tipos, como
K extends keyof T. - Constraints são verificadas em tempo de compilação, evitando erros em tempo de execução.
// Função genérica que acessa uma propriedade de um objeto.
// K é restrito a keyof T, garantindo que key existe em T.
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const pessoa = { nome: "Ana", idade: 28, ativo: true };
// Uso correto: key é uma chave válida de pessoa.
const nome = getProperty(pessoa, "nome"); // string
const idade = getProperty(pessoa, "idade"); // number
console.log(nome, idade);
// Exemplo com constraint explícita: exigir que T tenha a propriedade length.
function logLength<T extends { length: number }>(item: T): void {
console.log(`Comprimento: ${item.length}`);
}
logLength("TypeScript"); // string tem length
logLength([1, 2, 3]); // array tem length
// logLength(42); // Erro: number não tem length
// Múltiplos parâmetros genéricos com constraint.
function merge<T extends object, U extends object>(a: T, b: U): T & U {
return { ...a, ...b };
}
const merged = merge({ x: 1 }, { y: "dois" });
console.log(merged);