J'essaie d'utiliser des décorateurs de Typescript dans un de mes projets, mais j'ai rencontré un comportement étrange que je ne suis pas capable de comprendre.Le décorateur tapuscrit ne fonctionne que dans la même méthode
Il semble ne fonctionner que si la classe décorée se trouve dans la même méthode qui tente d'obtenir les métadonnées:
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
});
});
Mais dès que je me déplace en dehors de la méthode, il ne fonctionne plus:
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
});
});
Les deux tests utilisent ce décorateur de test:
function TestDecorator(value: any) {
return function (target: any, propertyKey: string) {
console.log(`I'm being decorated!`);
Reflect.defineMetadata('test', value, target, propertyKey);
};
}
Et les deux sont impriman ting à la console ...
En outre, à la fois le code transpiled je peux voir la propriété d'être correctement et exactement décorée de la même manière:
var Test = (function() {
function Test() {
}
__decorate([
TestDecorator('some value'),
__metadata("design:type", String)
], Test.prototype, "property", void 0);
return Test;
}());
Et voilà mon tsconfig.json
. Je crois est correct (es5
, emitDecoratorMetadata
et experimentalDecorators
):
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"declaration": true,
"outDir": "dist",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": true
},
"exclude": [
"node_modules",
"dist"
]
}
Qu'est-ce que je manque?