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
Produtocompleto. - Campos não informados devem usar valores padrão: nome
"Sem nome"e preco0.
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
- Definimos a interface
Produtocom três propriedades obrigatórias. - A função
atualizarProdutorecebeidedadosdo tipoPartial<Produto>, permitindo que qualquer campo seja omitido. - Criamos um objeto
padraocom todos os campos preenchidos. - Usamos
{ ...padrao, ...dados }para sobrescrever apenas os campos presentes emdados. - 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
dadosdiretamente:return dados;causaria erro porquePartial<Produto>não é atribuível aProduto. - Usar
Object.assignsem valores padrão:return Object.assign({ id }, dados);deixaria campos faltando e o tipo não seriaProduto.
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 }