2016-04-01 54 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会在应用程序启动后立即执行? –