フロントエンド/バックエンド データ構造間の単純なマッピングを作成しています。そのために、次のようなデコレータを作成しました。
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
}
}
);
};
}
そして、これが私がそれを使用する方法です:
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;
}
私が見ている問題は、実際のオブジェクトがデコレータに渡されるのではなく、常にそのプロトタイプであることです:
__decorate([
ApiField('yearCompanyFounded')
], VW.prototype, "yearEstablished", void 0);
つまり、デコレーターでインスタンスに何かを割り当てると、常にプロトタイプにアタッチされます。これは、インスタンスのみを定義したいプロパティがおよびクラスVWでも使用できることを意味します(この例では、これはである)。これにより、2 つの異なるクラスに同じ名前で異なる API フィールドを持つ 2 つのプロパティを持つことができなくなります。AbstractCarBMWyearEstablished
この動作を回避する方法はありますか?