修改类的方法装饰器?

时间:2017-01-06 13:29:04

标签: typescript

可能有可能开发一个方法装饰器,即:“@rpcMethod” 修改一个类的原型?

最后我要:

@rpcMethod
get(){
   ....
}

并且在运行时:

instance.getRpcMethods(); //returns ['get']

我在装饰器中尝试了所有类型的东西(即:修改target.prototype),但都失败了。

谢谢!

1 个答案:

答案 0 :(得分:1)

很抱歉迟到的回复,试试这个:

var rpcMethod = (target: Object, propName: string, propertyDescriptor: TypedPropertyDescriptor<() => any>) => {
    var desc = Object.getOwnPropertyDescriptor(target, "getRpcMethods");
    if (desc.configurable)
    {
        Object.defineProperty(target, "getRpcMethods", { value: function() { return this["rpcMethods"]; }, configurable: false });
        Object.defineProperty(target, "rpcMethods", { value: [] });
    }

    target["rpcMethods"].push(propName);
};


class MyClass
{
    public getRpcMethods():string[] {
        throw new Error("Should be implemented by decorator");
    }

    @rpcMethod
    public get() {
        return "x";
    }

    @rpcMethod
    public post() {
        return "y";
    }
}

var myInstance = new MyClass();

myInstance.getRpcMethods();