Ich baue eine einfache Zuordnung zwischen Frontend / Backend-Datenstruktur. Dafür habe ich einen Decorator erstellt, der wie folgt aussieht:
%Vor%Und so benutze ich es:
%Vor%Das Problem, das ich sehe, ist, dass anstelle des eigentlichen Objekts, das an den Dekorator übergeben wird, immer sein Prototyp ist:
%Vor% Das bedeutet, dass ich, während ich der Instanz im Decorator Material hinzufüge, immer an den Prototyp angehängt bin, was wiederum bedeutet, dass Eigenschaften, die nur die VW
-Instanz definieren sollen, auch auf AbstractCar
verfügbar sind. und die Klasse BMW
(in diesem Beispiel wäre dies yearEstablished
). Dies macht es unmöglich, zwei Eigenschaften mit demselben Namen, aber unterschiedlichen API-Feldern in zwei verschiedenen Klassen zu haben.
Gibt es eine Möglichkeit, dieses Verhalten zu umgehen?
Im Moment fügen alle drei Klassen dem selben Objekt Eigenschaften hinzu. Der Schlüssel, um dies zu beheben, besteht darin, das Objekt in target.data
zu klonen , so dass jede Klasse ein anderes Objekt verwendet, anstatt alle auf dasselbe Objekt zu verweisen.
Hier ist ein einfacheres Beispiel, das eine Möglichkeit zeigt:
%Vor% Das Problem ist, dass public
in einer Klasse kein Standard-JavaScript ist, sondern nur etwas, was TypeScript tut. Deshalb musst du vorsichtig sein, denn alles, was du tust, könnte in der Zukunft brechen.
Eine Möglichkeit besteht darin, Object.assign()
zum Hinzufügen von Instanzeigenschaften zu verwenden (IINM, apiFieldsBag
sollte vom Objekt, das vom Objektliteral erstellt wurde, an this
übergeben werden):
Tags und Links javascript decorator typescript ecmascript-next