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 una declaración y una definición / evaluación para la misma propiedad dos veces. Esta redundancia es significativa si tengo demasiadas propiedades en un objeto.
(¿Existe un operador que pueda extraer la interfaz / tipo de un objeto existente?)
¿Es posible?
fuente
var objectC = {...objectA, ...objectB};
. El formulario deobjectB
propiedades anulará las propiedades que ya fueron asignadasobjectA
, si las propiedades tienen el mismo nombre.propertyB: string
, mientras que objectD lo inferirá comopropertyB: number
. Puede escribir manualmente ambos C y D:type ABC = { propertyA: number; propertyB: string | number; propertyC: number; propertyX: string; propertyZ: string; }
o solo uno de ellos estableciendo propertyB en cadena o en número.Utilice un tipo de intersección + genéricos. Ej. De aquí
/** * 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
fuente
underscore.d.ts
Deberías optar por typeof .
type typeA = typeof objectA; type typeB = typeof objectB;
Para fusionarlos, puede usar la operación de intersección como ya se señaló basarat.
fuente
Utilice el operador de propagación de TypeScript que se transpile a Javascript Object.assign ()
Si necesita una fusión de objetos de árbol profundo, puede usar la función de cambio del paquete best-global
fuente
prueba esto..
const person = { name: 'TRilok', gender: 'Male' }; const tools = { computer: 'Mac', editor: 'Atom' }; const attributes = { handsomeness: 'Extreme', hair: 'Brown', eyes: 'Blue' }; const summary = {...person, ...tools, ...attributes};
fuente