Desafio TypeScript

Mapa com Record e inferência de função

Enunciado

Crie uma função criarMapa que recebe um array de objetos com id: number e nome: string e retorna um Record<number, string> mapeando id para nome. Além disso, use ReturnType e Parameters para tipar uma função executar que chama criarMapa com os parâmetros corretos e retorna o mesmo tipo. Imprima o mapa resultante.

Requisitos

  • criarMapa deve retornar Record<number, string>.
  • Use Parameters<typeof criarMapa> para tipar os parâmetros de executar.
  • Use ReturnType<typeof criarMapa> para tipar o retorno de executar.
  • A saída deve ser o objeto mapeado.

Código inicial

interface Item {
  id: number;
  nome: string;
}

function criarMapa(itens: Item[]): Record<number, string> {
  // seu código aqui
}

// Defina executar usando Parameters e ReturnType

console.log(executar([{ id: 1, nome: "A" }, { id: 2, nome: "B" }]));

Saída esperada

{ '1': 'A', '2': 'B' }
Ver dica

type Params = Parameters<typeof criarMapa>; e type Retorno = ReturnType<typeof criarMapa>;.

Mostrar solução
interface Item {
  id: number;
  nome: string;
}

function criarMapa(itens: Item[]): Record<number, string> {
  const mapa: Record<number, string> = {};
  for (const item of itens) {
    mapa[item.id] = item.nome;
  }
  return mapa;
}

type ParamsCriarMapa = Parameters<typeof criarMapa>;
type RetornoCriarMapa = ReturnType<typeof criarMapa>;

function executar(...args: ParamsCriarMapa): RetornoCriarMapa {
  return criarMapa(...args);
}

console.log(executar([{ id: 1, nome: "A" }, { id: 2, nome: "B" }]));

Passo a passo

  1. Definimos Item com id e nome.
  2. criarMapa recebe um array de Item e retorna Record<number, string>.
  3. Dentro da função, inicializamos um objeto vazio tipado como Record<number, string>.
  4. Iteramos com for...of e atribuímos mapa[item.id] = item.nome.
  5. Parameters<typeof criarMapa> extrai a tupla de parâmetros da função, que é [itens: Item[]].
  6. ReturnType<typeof criarMapa> extrai Record<number, string>.
  7. executar usa esses tipos e repassa os argumentos com spread.
  8. Chamamos executar e imprimimos o resultado.

Por que funciona

Record<number, string> descreve um objeto com chaves numéricas e valores string. Parameters e ReturnType são utility types que operam sobre o tipo da função, permitindo reutilizar sua assinatura sem reescrever tipos. Assim, se criarMapa mudar, executar se adapta automaticamente.

Erros comuns

  • Esquecer de tipar o objeto vazio: const mapa = {}; e depois mapa[item.id] = item.nome gera erro de índice implícito any.
  • Usar Parameters<criarMapa> em vez de Parameters<typeof criarMapa>: o primeiro espera um tipo de função, não o valor.
  • Retornar void em executar: o tipo de retorno inferido seria void, mas ReturnType exige Record<number, string>.

Outra forma de resolver

Usar Object.fromEntries:

return Object.fromEntries(itens.map(i => [i.id, i.nome]));

É preferível para código mais conciso, mas requer ajuste de tipo porque Object.fromEntries retorna { [k: string]: string }.

Saída esperada

{ '1': 'A', '2': 'B' }