【发布时间】:2016-02-28 03:50:18
【问题描述】:
我正在构建前端/后端数据结构之间的简单映射。为此,我创建了一个如下所示的装饰器:
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)。这使得在两个不同的类中不可能有两个同名但 API 字段不同的属性。
有没有办法规避这种行为?
【问题讨论】:
-
顺便说一句,您不需要在
_.assign(前面加上target.apiFieldsBag =。您还可以选择使用 ES6Object.assign()而不是_.assign()。 -
是的,当我再次查看问题时,我想到了这一点。无论如何感谢您的提醒:)
标签: javascript typescript decorator ecmascript-next