typescript - objetos - propiedades de un objeto
¿Cómo combinar las propiedades del objeto en mecanografiado? (4)
Me gustaría saber la mejor manera de hacer esto, digamos que tengo dos objetos
var objectA = {
propertyA: 1,
propertyB: 2
...
propertyM: 13
}
var objectB = {
propertyN: 14,
propertyO: 15
...
propertyZ: 26
}
Si objectC es creado por
var objectC = Object.assign(objectA, objectB);
¿Cómo puedo declarar / describir objectC, para que el compilador / IDE sepa que tiene las propiedades de objectA y objectB?
Me gustaría encontrar una manera sin la necesidad de definir interfaces para objectA y objectB. No quiero escribir la declaración y la definición / evaluación para la misma propiedad dos veces. Esta redundancia es significativa si tengo demasiadas propiedades en un objeto.
(¿Hay un operador que pueda extraer la interfaz / tipo de un objeto existente?)
¿Es posible?
¿Entonces el compilador / IDE sabe que tiene las propiedades de objectA y objectB?
Utilice un tipo de intersección + genéricos. Eg desde aqui
/**
* Quick and dirty shallow extend
*/
export function extend<A>(a: A): A;
export function extend<A, B>(a: A, b: B): A & B;
export function extend<A, B, C>(a: A, b: B, c: C): A & B & C;
export function extend<A, B, C, D>(a: A, b: B, c: C, d: D): A & B & C & D;
export function extend(...args: any[]): any {
const newObj = {};
for (const obj of args) {
for (const key in obj) {
//copy all the fields
newObj[key] = obj[key];
}
}
return newObj;
};
Más
Ambos se mencionan aquí: https://basarat.gitbooks.io/typescript/content/docs/types/type-system.html
(¿Hay un operador que pueda extraer la interfaz / tipo de un objeto existente? ¿Es posible?)
Usted debe ir para typeof .
type typeA = typeof objectA;
type typeB = typeof objectB;
Para fusionarlos, puede usar la operación de intersección como basarat ya señalado.
type typeC = typeA & typeB
Parece que esto debería hacer el truco:
var objectA = {
propertyA: 1,
propertyB: 2,
.
. // more properties here
.
propertyM: 13
};
var objectB = {
propertyN: 14,
propertyO: 15,
.
. // more properties here
.
propertyZ: 26
};
var objectC = {...objectA, ...objectB}; // this is the answer
var a = objectC.propertyA;
var n = objectC.propertyN;
Basado en este artículo: https://blog.mariusschulz.com/2016/12/23/typescript-2-1-object-rest-and-spread
Además, el orden de las variables en la descomposición importa. Considera lo siguiente:
var objectA = {
propertyA: 1,
propertyB: 2, // same property exists in objectB
propertyC: 3
};
var objectB = {
propertyX: ''a'',
propertyB: ''b'', // same property exists in objectA
propertyZ: ''c''
};
// objectB will override existing properties, with the same name,
// from the decomposition of objectA
var objectC = {...objectA, ...objectB};
// result: ''b''
console.log(objectC.propertyB);
// objectA will override existing properties, with the same name,
// from the decomposition of objectB
var objectD = {...objectB, ...objectA};
// result: ''2''
console.log(objectD.propertyB);
Usar el operador de propagación de Typescript que se transpilea a Javascript Object.assign ()
Si necesita fusionar un objeto de árbol profundo, puede utilizar la función de cambio del best-global paquete best-global