objetos objeto llamar importar herencia clases clase arreglo array typescript casting typing

typescript - objeto - interface angular 4



Manera limpia de asignar objetos a otros objetos? (2)

Con respecto a las propiedades de copia del mismo nombre, puede usar Object.assign :

fromDraft(Draft draft) { Object.assign(this, draft); this.info = new Info(); this.info.value = draft.summary; }

El problema es que también creará este this.summary , pero es una forma conveniente de copiar propiedades, por lo que si puede modelar sus clases de manera diferente, puede usarlo.

Otra opción es tener una lista de nombres de propiedades compartidas y luego iterarla:

const SHARED_NAMES = ["id", "name"]; fromDraft(Draft draft) { SHARED_NAMES.forEach(name => this[name] = draft[name]); this.info = new Info(); this.info.value = draft.summary; }

¿Hay una buena manera de asignar objetos a otros objetos? Las recomendaciones de la biblioteca también son bienvenidas.

Por ejemplo, digamos que tengo estas clases:

export class Draft { id: number; name: string; summary: string; } export class Book { id: number; name: string; info: Info; } export class Info { value: string; }

Tradicionalmente, para mapear campos de Draft a Book , tendría que hacerlo manualmente para cada campo:

export class Book { [...] fromDraft(Draft draft) { this.id = draft.id; this.name = draft.name; this.info = new Info(); this.info.value = draft.summary; } }

¿Hay una manera más fácil de asignar los campos de objetos que se nombran de la misma manera? Por ejemplo, los campos de id Y name Draft y Book , a la vez que se pueden definir asignaciones personalizadas, como draft.summary a book.info.value .

Tenga en cuenta que esto está lejos de mi caso de uso real. Aquí no es tan malo hacer asignaciones de forma manual, pero para los objetos con muchos campos con nombres similares es bastante complicado.

¡Gracias!


Independientemente de TypeScript, puede usar lodash _.mergeWith y pasar su función de fusión.

Ventaja: Más genérico (si tiene más lógica, puede agregarlo (para tipos complejos, por ejemplo)

Desventaja : necesitas lodash

Algo como:

var a = { foo: [1, 2, 3], bar: true } var b = { foo: [4, 5, 6, 7], bar: false } var c = _.mergeWith(a, b, function(a, b) { if (a.concat) { return a.concat(b); } else { return b; } }) console.log(''c'', c);

<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>

http://jsbin.com/xugujon/edit?html,js