私はフロントエンド/バックエンドのデータ構造間の単純なマッピングを構築しています。デコレータで非プロトタイプにプロパティを割り当てる
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
インスタンスのみを定義したいプロパティは、AbstractCar
クラスとBMW
クラス(この例ではyearEstablished
)で使用できます。これにより、同じ名前で2つの異なるクラスの異なるAPIフィールドを持つことは不可能になります。
この動作を回避する方法はありますか?
!!!!:ここ
は、これを行うの1つの方法を示しシンプルな例です – Arjun
'_.assign(')の代わりに 'target.apiFieldsBag ='は必要ありません。また、 '_.assign()の代わりにES6' Object.assign() ' –
ええ、私はもう一度質問を見ていると思いました。とにかく頭のおかげで:) –