Desafio TypeScript
Mesclando objetos com tipos precisos
Enunciado
Crie uma função mergeObjects que recebe dois objetos e retorna um novo objeto com as propriedades de ambos. Use múltiplos parâmetros genéricos com constraints extends object e o tipo de interseção T & U.
Requisitos
- A função deve se chamar
mergeObjectse aceitarobj1: Teobj2: U. - Os genéricos devem ter a constraint
extends object. - O retorno deve ser
T & U. - Deve mesclar as propriedades, com as do segundo objeto sobrescrevendo as do primeiro em caso de conflito.
Código inicial
// Complete a função mergeObjects
function mergeObjects<T extends object, U extends object>(obj1: T, obj2: U): T & U {
// Seu código aqui
}
const obj1 = { a: 1, b: "texto" };
const obj2 = { b: 2, c: true };
const merged = mergeObjects(obj1, obj2);
console.log(merged); // { a: 1, b: 2, c: true }
Saída esperada
{ a: 1, b: 2, c: true }
Ver dica
Use o spread operator: { ...obj1, ...obj2 }. O TypeScript infere o tipo como T & U.
Mostrar solução
// mergeObjects: combina dois objetos em um novo, com tipo de interseção.
function mergeObjects<T extends object, U extends object>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 }; // Spread: propriedades de obj2 sobrescrevem as de obj1
}
const obj1 = { a: 1, b: "texto" };
const obj2 = { b: 2, c: true };
const merged = mergeObjects(obj1, obj2);
console.log(merged); // { a: 1, b: 2, c: true }
Passo a passo
mergeObjectsrecebe dois genéricosTeU, ambos com constraintextends object.- Isso garante que só passamos objetos, não primitivos.
- O retorno é anotado como
T & U, a interseção dos dois tipos. - Usamos spread
{ ...obj1, ...obj2 }para criar um novo objeto. - Propriedades de
obj2sobrescrevem as deobj1se tiverem o mesmo nome. - O resultado é impresso, mostrando
b: 2(do segundo objeto).
Por que funciona
A constraint extends object impede tipos primitivos. O tipo de interseção T & U combina as propriedades de ambos, e o spread faz a mesclagem em tempo de execução. O TypeScript infere corretamente o tipo resultante.
Erros comuns
- Não usar
extends object: permitiriamergeObjects(1, 2), causando erro em tempo de execução. - Esquecer o spread: retornar
obj1ouobj2diretamente não mescla. - Anotar retorno como
any: perde a precisão do tipo.
Outra forma de resolver
Poderia usar Object.assign({}, obj1, obj2), mas o spread é mais moderno e igualmente tipado.
Saída esperada
{ a: 1, b: 2, c: true }