Médio TypeScript

Obtendo valor com tipo inferido

Enunciado

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].

Requisitos

  • A função deve se chamar getValues e aceitar items: T[] e key: K.
  • O retorno deve ser T[K][].
  • Deve funcionar para qualquer array de objetos com a chave especificada.

Código inicial

// Complete a função getValues
function getValues<T, K extends keyof T>(items: T[], key: K): T[K][] {
  // Seu código aqui
}

const usuarios = [
  { nome: "Ana", idade: 28 },
  { nome: "Bruno", idade: 32 },
];
console.log(getValues(usuarios, "nome")); // ["Ana", "Bruno"]

Saída esperada

["Ana", "Bruno"]
Ver dica

Use items.map(item => item[key]) para extrair os valores.

Mostrar solução
// getValues: extrai os valores de uma chave específica de um array de objetos.
function getValues<T, K extends keyof T>(items: T[], key: K): T[K][] {
  return items.map(item => item[key]); // Mapeia cada objeto para o valor da chave
}

const usuarios = [
  { nome: "Ana", idade: 28 },
  { nome: "Bruno", idade: 32 },
];
console.log(getValues(usuarios, "nome")); // ["Ana", "Bruno"]

Passo a passo

  1. A função getValues tem dois genéricos: T (tipo dos objetos) e K (chave).
  2. K extends keyof T restringe K às chaves de T.
  3. O parâmetro items é um array de T, e key é do tipo K.
  4. O retorno é T[K][], um array com os valores da propriedade K.
  5. Usamos items.map para transformar cada objeto no valor de key.
  6. Chamamos com usuarios e "nome", obtendo ["Ana", "Bruno"].

Por que funciona

O map aplica item[key] a cada elemento. Como K é uma chave válida de T, o TypeScript sabe que item[key] é do tipo T[K], e o array resultante é T[K][].

Erros comuns

  • Esquecer a constraint: K extends keyof T é essencial para que item[key] seja permitido.
  • Retornar any[] em vez de T[K][]: perde a tipagem e a segurança.

Outra forma de resolver

Poderia usar um loop for e push, mas map é mais idiomático e conciso.

Saída esperada

["Ana", "Bruno"]