2017-07-26 66 views
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。我相信這是正確的(es5emitDecoratorMetadataexperimentalDecorators):

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

我缺少什麼?

回答

0

對於那些同樣的問題,我不認爲這是一個解決方案,但在我的情況下,從Webpack切換到Rollup.js解決了這個問題...