propiedades objetos objeto metodos llamar instanciar inicializar clases clase array typescript

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);