function marge(obj1: object, obj2: object) { return Object.assign(obj1, obj2); } const margeObj = marge( {firstName: "John"}, {lastName : "Doe"} ); console.log(margeObj.firstName);Typescipt arroja un error en la última línea al intentar obtener la propiedad firstName de mergeObj.
La propiedad 'firstName' no existe en el tipo 'objeto'.
Tanto obj1 como obj2 son objetos y agregar un objeto de tipo de retorno no soluciona este problema.
TypeScript no entiende qué tipo debe devolver la función de combinación. Puede especificar los argumentos con genéricos y luego fusionarlos en el tipo de retorno con el operador de intersección & :
function marge<T extends {}, S extends {}>(obj1: T, obj2: S): T & S { return Object.assign(obj1, obj2); } const margeObj = marge({firstName: "John"}, {lastName: "Doe"}); console.log(margeObj.firstName); El tipo devuelto será la intersección entre T y S , todas las propiedades en los argumentos del objeto estarán disponibles en el tipo de retorno.
X extends {} simplemente restringe el argumento a un objeto.
Creo que tienes que usar una interfaz como esta.
function marge(obj1: object, obj2: object) { return Object.assign(obj1, obj2); } interface user { firstName:string; lastName:string; } const margeObj:user = marge( {firstName: "John"}, {lastName : "Doe"} ); console.log(margeObj.firstName);Una solución es usar la cuantificación existencial, como:
function marge<T, U>(obj1: T, obj2: U): T & U { return Object.assign(obj1, obj2); } Esto dice que para los parámetros obj1 y obj2 existen algunos tipos, T y U , respectivamente. La función no sabe cuáles son esos tipos, pero sí sabe que debe devolver un tipo de intersección de ellos.