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
criarMapadeve retornarRecord<number, string>.- Use
Parameters<typeof criarMapa>para tipar os parâmetros deexecutar. - Use
ReturnType<typeof criarMapa>para tipar o retorno deexecutar. - 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
- Definimos
Itemcomidenome. criarMaparecebe um array deIteme retornaRecord<number, string>.- Dentro da função, inicializamos um objeto vazio tipado como
Record<number, string>. - Iteramos com
for...ofe atribuímosmapa[item.id] = item.nome. Parameters<typeof criarMapa>extrai a tupla de parâmetros da função, que é[itens: Item[]].ReturnType<typeof criarMapa>extraiRecord<number, string>.executarusa esses tipos e repassa os argumentos com spread.- Chamamos
executare 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 depoismapa[item.id] = item.nomegera erro de índice implícito any. - Usar
Parameters<criarMapa>em vez deParameters<typeof criarMapa>: o primeiro espera um tipo de função, não o valor. - Retornar
voidemexecutar: o tipo de retorno inferido seriavoid, masReturnTypeexigeRecord<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' }