typescript1.5 - Temel fonksiyon yürütüldüğünde typescript dekoratör metodunu çağır
Typescript tasarımının nasıl çalıştığına göre, eğer şöyle bir dekoratör yazarsam,
class foo{
@fooDecorator
public fooMethod(){
}
}
transpile edilmiş JavaScript'i olarak verir
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;
}());
Transpile edilmiş kodlarına göre uygulamam başlatıldığında dekoratör fonksiyon çalıştırılıyor, ama benim istediğim şey, alttaki fonksiyon "fooMethod" çalıştırıldığında dekoratör metot "fooDecorator" çalışsın, bunu nasıl sağlayabilirim, lütfen bu konuda bana yardım edin
Cevap #1
Bunu şöyle yapabilirsiniz. Dekoratörde orijinal metodunuzu, her çağrıldığında öncelikle çağrılması gereken verilen metodu çağıracak ve ardından orijinal metodu çağıracak 'wrapper' ile değiştirin.
Aşağıdaki kod bu yaklaşımı göstermektedir:
Senin dekoratörün:
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(target, args);
}
return descriptor;
}
}
Ve yöntemi bu şekilde @Foo dekoratörü ile süslersiniz:
@Foo((...args: any[]) => { console.log("Before method call:", args[0]); })
private TestMethod(param: string): void
{
console.log("Method call");
//...
}
Umarım bu yardımcı olur.
