2017-01-06 6 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

Смежные вопросы