Ich bin überrascht, dass sich keine der Antworten auf Object.assign bezieht, denn das ist die Technik, die ich immer verwende, wenn ich über "Komposition" in JavaScript nachdenke.
Und es funktioniert wie erwartet in TypeScript:
interface IExisting {
userName: string
}
interface INewStuff {
email: string
}
const existingObject: IExisting = {
userName: "jsmith"
}
const objectWithAllProps: IExisting & INewStuff = Object.assign({}, existingObject, {
email: "jsmith@someplace.com"
})
console.log(objectWithAllProps.email); // jsmith@someplace.com
Vorteile
- Typensicherheit durchgängig, weil Sie nicht die
any
überhaupt tippen
- verwendet TypeScripts Aggregat-Typ (bezeichnet durch die
&
bei der Deklaration des Typs von objectWithAllProps
), was deutlich macht, dass wir einen neuen Typ "on-the-fly" (d.h. dynamisch) komponieren
Zu beachtende Dinge
- Object.assign hat seine eigenen einzigartigen Aspekte (die den meisten erfahrenen JS-Entwicklern gut bekannt sind), die beim Schreiben von TypeScript berücksichtigt werden sollten.
- Sie kann auf veränderliche oder unveränderliche Weise verwendet werden (die unveränderliche Art habe ich oben demonstriert, was bedeutet, dass
existingObject
bleibt unangetastet und hat daher keine Auswirkung auf die email
Eigentum. Für die meisten Programmierer im funktionalen Stil ist das eine gute Sache, da das Ergebnis die einzige neue Änderung ist.)
- Object.assign funktioniert am besten, wenn Sie flache Objekte haben. Wenn Sie zwei verschachtelte Objekte kombinieren, die nichtigbare Eigenschaften enthalten, kann es passieren, dass Sie wahrheitsgemäße Werte mit undefinierten überschreiben. Wenn Sie auf die Reihenfolge der Object.assign-Argumente achten, sollte das kein Problem sein.