2017-01-06 3 views
0

メソッドデコレータを開発することは可能でしょうか?つまり、 がクラスのプロトタイプを変更する "@rpcMethod"ですか?クラスを変更するメソッドデコレータ?

@rpcMethod 
get(){ 
    .... 
} 

と実行時:私が欲しい終わり

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

私はデコレータ内部物事のすべての並べ替えをしようとした(すなわち:target.prototypeを変更)それはすべて失敗しました。

ありがとうございました!返事が遅れて申し訳ありません

+0

あなたはクラスのデコレータを使用することができることを知っていますか? – Alex

+0

はい、でも、実行時に '@rpcMethod'で装飾されたすべてのメソッドをどのように収集するのか分かりません。 – xamiro

答えて

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(); 
+0

ねえ、素晴らしい!どうもありがとうございます。 – xamiro

関連する問題