Fácil TypeScript

Atualização parcial com Partial

Enunciado

Crie uma função atualizarProduto que recebe um id e um objeto do tipo Partial<Produto> e retorna um Produto completo, usando valores padrão para os campos não informados. O tipo Produto tem id: number, nome: string e preco: number.

Requisitos

  • A função deve aceitar um segundo parâmetro do tipo Partial<Produto>.
  • O retorno deve ser um Produto completo.
  • Campos não informados devem usar valores padrão: nome "Sem nome" e preco 0.

Código inicial

interface Produto {
  id: number;
  nome: string;
  preco: number;
}

function atualizarProduto(id: number, dados: Partial<Produto>): Produto {
  // seu código aqui
}

console.log(atualizarProduto(1, { nome: "Caneta" }));

Saída esperada

{ id: 1, nome: 'Caneta', preco: 0 }
Ver dica

Use o spread operator para mesclar os valores padrão com os dados recebidos.

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

function atualizarProduto(id: number, dados: Partial<Produto>): Produto {
  const padrao: Produto = { id, nome: "Sem nome", preco: 0 };
  return { ...padrao, ...dados };
}

console.log(atualizarProduto(1, { nome: "Caneta" }));

Passo a passo

  1. Definimos a interface Produto com três propriedades obrigatórias.
  2. A função atualizarProduto recebe id e dados do tipo Partial<Produto>, permitindo que qualquer campo seja omitido.
  3. Criamos um objeto padrao com todos os campos preenchidos.
  4. Usamos { ...padrao, ...dados } para sobrescrever apenas os campos presentes em dados.
  5. Retornamos o objeto mesclado, que satisfaz Produto.

Por que funciona

O Partial<Produto> transforma todas as propriedades em opcionais, então o chamador pode passar só { nome: "Caneta" }. O spread mescla os valores padrão com os fornecidos, garantindo que o retorno tenha todos os campos. Isso é seguro em tempo de compilação e evita repetir a interface.

Erros comuns

  • Esquecer de tipar o segundo parâmetro como Partial<Produto>: function atualizarProduto(id: number, dados: Produto) faria o compilador exigir todos os campos.
  • Retornar dados diretamente: return dados; causaria erro porque Partial<Produto> não é atribuível a Produto.
  • Usar Object.assign sem valores padrão: return Object.assign({ id }, dados); deixaria campos faltando e o tipo não seria Produto.

Outra forma de resolver

Usar Object.assign com um objeto padrão:

return Object.assign({ id, nome: "Sem nome", preco: 0 }, dados);

É preferível quando você quer mutar um objeto existente em vez de criar um novo.

Saída esperada

{ id: 1, nome: 'Caneta', preco: 0 }