Da trilha de TypeScript Este conceito ainda não saiu como card do dia. ir para o card de hoje

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

  • extends em genéricos restringe os tipos aceitos, permitindo acessar membros com segurança.
  • keyof T produz uma união literal dos nomes das propriedades de T.
  • O acesso indexado T[K] obtém o tipo da propriedade K em T.
  • 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.
constraints.ts
// 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);

Exercícios

  1. 1
    Fácil

    Acessando propriedade com segurança

    Crie uma função genérica pluck que recebe um objeto e uma chave, e retorna o valor dessa chave. Use K extends keyof T para garantir que a chave existe no objeto.

    Resolver
  2. 2
    Médio

    Obtendo valor com tipo inferido

    Crie uma função getValues que recebe um array de objetos e uma chave, e retorna um array com os valores dessa chave em cada objeto. Use K extends keyof T e acesso indexado T[K].

    Resolver
  3. 3
    Desafio

    Mesclando objetos com tipos precisos

    Crie uma função mergeObjects que recebe dois objetos e retorna um novo objeto com as propriedades de ambos. Use múltiplos parâmetros genéricos com constraints extends object e o tipo de interseção T & U.

    Resolver

Continue estudando