3
我想在我的一個項目中使用Typescript裝飾器,但我遇到了一個奇怪的行爲,我無法理解。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);
};
}
無一不是首席婷到控制檯...
此外,雙方transpiled代碼中,我可以看到的財產被正確和準確的裝飾以同樣的方式:
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"
]
}
我缺少什麼?