2016-04-01 27 views
0

按設計如何打字稿的作品,如果我寫了一個裝飾一樣,呼叫打字稿裝飾方法

class foo{ 

    @fooDecorator 
    public fooMethod(){ 

    } 
} 

它給人的transpiled JavaScript作爲

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 
return c > 3 && r && Object.defineProperty(target, key, r), r; 
}; 
var foo = (function() { 
function foo() { 
} 
foo.prototype.fooMethod = function() { 
}; 
__decorate([ 
    fooDecorator 
], foo.prototype, "fooMethod", null); 
return foo; 
}()); 

按照有每當我的應用程序得到啓動時傳輸代碼裝飾器函數得到執行,但我想如何是每當底層函數「fooMethod」執行裝飾器方法「fooDecorator」應該執行,我怎麼能達到相同的,請幫助我的問題

回答

1

你可以這樣做。在裝飾器中用'包裝器'替換原來的方法,它將首先調用應該每次調用的提供的方法,然後調用原來的方法。

下面的代碼說明了這種方法:

你的裝飾:

export function Foo(funcToCallEveryTime: (...args: any[]) => void) 
{ 
    return (target: any, key: string, descriptor: any) => 
    { 
     var originalMethod = descriptor.value; 

     descriptor.value = function (...args: any[]) { 
      funcToCallEveryTime(...args); 
      return originalMethod.apply(this, args); 
     } 

     return descriptor; 
    } 
} 

和方法,你@foo裝飾裝修這樣的:

@Foo((...args: any[]) => { console.log("Before method call:", args[0]); }) 
private TestMethod(param: string): void 
{ 
    console.log("Method call"); 
    //... 
} 

希望這有助於。

+0

thnx的回覆,但我不想要傳遞任何參數給裝飾器 –

+0

你可以硬編碼函數內裝飾器inself和應用裝飾器像'@Foo()'。但它不會那麼靈活。 – Amid

+0

但根據傳輸的JavaScript foo會在應用程序啓動後立即執行? –