我正在尝试在我的一个项目中使用Typescript装饰器,但是我遇到了一种我无法理解的奇怪行为。
如果装饰类位于尝试获取元数据的同一方法内,它似乎才有效:
describe('metadata tests', () => {
it('should retrieve metadata', () => {
class Test {
@TestDecorator('some value')
property: string;
}
const metadata = Reflect.getMetadata('test', new Test(), 'property');
expect(metadata).toEqual('some value'); //Passes
});
});
但是一旦我将它移到方法之外,它就不再起作用了:
describe('metadata tests', () => {
class Test {
@TestDecorator('some value')
property: string;
}
it('should retrieve metadata', () => {
const metadata = Reflect.getMetadata('test', new Test(), 'property');
expect(metadata).toEqual('some value'); //Fails
});
});
两个测试都使用此测试装饰器:
function TestDecorator(value: any) {
return function (target: any, propertyKey: string) {
console.log(`I'm being decorated!`);
Reflect.defineMetadata('test', value, target, propertyKey);
};
}
两者都在打印到控制台......
此外,在这两个已编译的代码中,我可以看到正确装饰的属性,并且完全相同:
var Test = (function () {
function Test() {
}
__decorate([
TestDecorator('some value'),
__metadata("design:type", String)
], Test.prototype, "property", void 0);
return Test;
}());
这是我的tsconfig.json
。我认为是正确的(es5
,emitDecoratorMetadata
和experimentalDecorators
):
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"declaration": true,
"outDir": "dist",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": true
},
"exclude": [
"node_modules",
"dist"
]
}
我错过了什么?
答案 0 :(得分:0)
对于那些有同样问题的人,我不认为这是一个解决方案,但在我的情况下,从Webpack切换到Rollup.js解决了这个问题......