2017-07-26 1 views
3

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?

Répondre

0

Pour ceux qui ont le même problème, je ne pense pas que ce soit une solution mais, dans mon cas, le passage de Webpack à Rollup.js a résolu le problème ...