2016-01-20 69 views
3

我想装饰一个setter函数,一类像这样:打字稿装饰setter函数

export class SearchResultSortBy{ 
    private sortByChoice; 
    constructor() { ...} 

    /* getters & setters */ 
    get sortBy() { 
     return this.sortByChoice; 
    }; 

    @myDeco({o:'something',o2:'another something'}) 
    set sortBy(sortBy) { 
     this.sortByChoice = sortBy; 
    }; 

} 

与装饰:

export function myDeco(element:any){ 
     return (target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => { 
      descriptor.set = function(...args: any[]) { 
       console.log("The method args are: " + JSON.stringify(args)); // pre 
       var result = originalMethod.apply(this, args);    // run and store the result 
       someOtherStaticClass.someFunc(element);    // post 
       return result;            // return the result of the original method 
      }; 
     return descriptor; 
    }; 
} 

但装饰是从来没有所谓的/没有按”不要做任何事情。
如果我放在@myDeco上形成消气功能的顶部,然后装饰被调用,它的工作,这是非常奇怪的......(装饰二传手FUNC。)

是有可能装修setter函数在打字稿?

回答

3

如果您将更改位置获取器和设置器以便让setter首先进入 - 将调用装饰器。

@myDeco({o:'something',o2:'another something'}) 
set sortBy(sortBy) { 
    this.sortByChoice = sortBy; 
}; 

get sortBy() { 
    return this.sortByChoice; 
}; 

由于您只能修饰setter或getter(从来都没有),所以首先声明什么是重要的。

EDIT

其原因在装饰放置的限制(包括上setter和getter)是属性的方式在JavaScript中定义的方式。 您的“sortby”属性getter和setter不是两个单独的属性。它是定义了setter和getter的一个属性。 装饰者被附加到财产,因此你可以附加到属性只有一次。无论你使用哪一个getter或setter来应用装饰器 - 所产生的js都会非常激动人心。 你可以更清楚地看到我的意思是在生成的js代码寻找你的样品(有点简化):

function myDeco(element) { 
    return function (target, propertyKey, descriptor) { 
     descriptor.set = function() { 
      var args = []; 
      for (var _i = 0; _i < arguments.length; _i++) { 
       args[_i - 0] = arguments[_i]; 
      } 
      return 12; 
     }; 
     return descriptor; 
    }; 
} 
var SearchResultSortBy = (function() { 
    function SearchResultSortBy() { 
    } 
    Object.defineProperty(SearchResultSortBy.prototype, "sortBy", { 
     get: function() { 
      return this.sortByChoice; 
     }, 
     set: function (sortBy) { 
      this.sortByChoice = sortBy; 
     }, 
     enumerable: true, 
     configurable: true 
    }); 
    ; 
    ; 
    __decorate([ 
     myDeco({ o: 'something', o2: 'another something' }), 
     __metadata('design:type', Object), 
     __metadata('design:paramtypes', [Object]) 
    ], SearchResultSortBy.prototype, "sortBy", null); 
    return SearchResultSortBy; 
})(); 

注意__decorate函数是如何调用,它接受作为输入。

事实上,typescript编译器仅考虑先定义的内容(没有装饰器的getter)并忽略应用于兄弟设置器的任何装饰器 - 看起来像一个编译器错误,希望在将来的版本中解决。如果有更多知识的人可以证明我错了,并且有这种行为的原因,我会很高兴。

+0

这确实有效。请你详细说明为什么订单如此重要?为什么我不能装饰两个?这是打字稿成熟度问题吗? – Igoros