减少Typescript中的getter/setter样板

减少Typescript中的getter/setter样板,typescript,Typescript,在Typescript中,我经常发现自己在编写这种getter/setter样板: private _length = 0; get length(): number { return this._length; } set length(value: number) { this._length = value; } 在C#中,我知道你可以这样写: public length { get; set; } function prop(target: Object, name: string

在Typescript中,我经常发现自己在编写这种getter/setter样板:

private _length = 0;

get length(): number { return this._length; }
set length(value: number) { this._length = value; }
在C#中,我知道你可以这样写:

public length { get; set; }
function prop(target: Object, name: string) {
  Object.defineProperty(target, name, {
    get: function() { return this["_" + name]; },
    set: function(value) { this["_" + name] = value; },
    enumerable: true,
    configurable: true
  });
}

有没有一种等效的方法来简化我的Typescript代码?

我发现的一种方法是使用decorator,它是在Typescript 1.5中引入的。实现如下所示:

public length { get; set; }
function prop(target: Object, name: string) {
  Object.defineProperty(target, name, {
    get: function() { return this["_" + name]; },
    set: function(value) { this["_" + name] = value; },
    enumerable: true,
    configurable: true
  });
}
现在,您可以将OP中的代码替换为:

@prop length = 0;
需要注意的一点是,
\u length
属性将添加到对象中。如果你不需要访问它,你就很好!如果确实需要使用它,并且希望它自动完成,则可以对属性进行如下注释:

@prop length = 0; private _length = 0;

+1.此外,将getter和setter decorator分开并仅在需要时使用它们也很有用:
@get@set length=0
@get id等等。我想知道这样一个能手/能手的意义是什么?也就是说,既然TypeScript中没有覆盖限制,它们与直接暴露字段有什么不同?如果关键是要有一个只读字段,为什么不通过property descriptor?@billc.cn正确地执行它呢?在我的例子中,我实际上是在get/set函数中添加了额外的功能,以便在值更改时触发主对象上的事件。