Ich baue eine einfache Zuordnung zwischen Frontend/Backend-Datenstruktur. Um das zu tun, dass ich ein Dekorateur erstellt haben, die wie folgt aussieht: Zuweisen von Eigenschaften zu Nicht-Prototyp mit Dekoratoren
function ApiField(
apiKey: string,
setFn: (any) => any = (ret) => ret,
getFn: (any) => any = (ret) => ret
) {
return function (target: AbstractModel, propertyKey: string) {
target.apiFieldsBag = target.apiFieldsBag || {};
_.assign(
target.apiFieldsBag,
{
[propertyKey]: {
apiKey: apiKey,
setFn: setFn,
getFn: getFn
}
}
);
};
}
Und das ist, wie ich es verwenden:
class AbstractCar {
@ApiField('id')
public id: string = undefined;
}
class BMW extends AbstractCar {
@ApiField('cylinders')
public cylinderCount: number;
}
class VW extends AbstractCar {
@ApiField('yearCompanyFounded')
public yearEstablished: number;
}
Das Problem, das ich sehe, ist, dass statt das eigentliche Objekt an den Dekorateur geleitet wird es immer sein Prototyp:
__decorate([
ApiField('yearCompanyFounded')
], VW.prototype, "yearEstablished", void 0);
was bedeutet, dass, wie ich Sachen in dem Dekorateur zum Beispiel am zuweisen, es immer mit dem Prototyp angebracht ist, die wiederum bedeutet, dass Eigenschaften, die ich möchte nur die VW
Instanz definiert sind auch auf der Klasse verfügbar (in diesem Beispiel wäre dies). 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?
ECMAScript 7 ... !!!! – Arjun
Nebenbei, Sie brauchen nicht die 'target.apiFieldsBag =' vor '_.assign ('. Sie haben auch die Option, ES6 'Object.assign()' anstelle von '_.assign() zu verwenden ' –
Yeah, dachte ich, als ich wieder über die Frage nachdachte.Auch Danke für die Köpfe auf jeden Fall :) –