1
是否可以在属性装饰器中定义一些属性,并让TS编译器理解这些新属性?TS装饰器:生成编译器可见的属性
在下面的代码中,aExtra
属性是通过命名属性访问器v['aExtra']
或通过强制转换为任何(<any>a).aFieldExtra
访问,但不能直接作为v.aExtra
编译器不会看到它(物业不存在)。
有没有可能让编译器看到这个额外的属性?
function withExtra(target: any, fieldName: string) {
Object.defineProperty(target, fieldName + 'Extra', {
get: function(): String {
return this[fieldName] + 'Extra'; // <EnumValue[]>this._beanInternalService.getEnumValues(enumType);
},
configurable: true,
enumerable: true
});
}
class A {
@withExtra
a: string;
}
describe('test Extra',() => {
it('addsExtra',() => {
const v = new A();
v.a = 'a';
expect(v['aExtra']).toEqual('aExtra'); // Works as expected
expect((<any>v).aExtra).toEqual('aExtra'); // Compiles, but not very nice
// does not compile :
// expect(v.aExtra).toEqual('aExtra');
});
});
它确实有帮助,即使你的答案表示今天没有“很好”的解决方案。我相信我会手动添加aExtra字段的声明。感谢问题的链接 –