Typescript装饰器只能在同一个方法中使用

时间:2017-07-26 17:05:51

标签: javascript typescript decorator reflect-metadata

我正在尝试在我的一个项目中使用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。我认为是正确的(es5emitDecoratorMetadataexperimentalDecorators):

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "declaration": true,
    "outDir": "dist",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": true
  },
  "exclude": [
    "node_modules",
    "dist"
  ]
}

我错过了什么?

1 个答案:

答案 0 :(得分:0)

对于那些有同样问题的人,我不认为这是一个解决方案,但在我的情况下,从Webpack切换到Rollup.js解决了这个问题......