首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行基础函数时调用类型记录装饰器方法

在执行基础函数时调用类型记录装饰器方法
EN

Stack Overflow用户
提问于 2016-04-01 06:05:23
回答 1查看 7.5K关注 0票数 8

根据打字稿设计的工作原理,如果我写一个装潢师,

代码语言:javascript
复制
class foo{

   @fooDecorator
   public fooMethod(){

    }
}

它将转置的javascript作为

代码语言: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”就应该执行,我如何才能达到同样的目的,请帮助我解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 07:57:53

你可以这样做。在装饰器中,将原来的方法替换为“包装器”,它将首先调用每次应该调用的提供的方法,然后调用原始方法。

下面的代码说明了这种方法:

你的装饰师:

代码语言:javascript
复制
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;
    }
}

你用@Foo装饰器装饰的方法如下:

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

希望这能有所帮助。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36349158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档