【问题标题】:Reducing getter/setter boilerplate in Typescript减少 Typescript 中的 getter/setter 样板
【发布时间】:2015-06-07 01:55:26
【问题描述】:

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

private _length = 0;

get length(): number { return this._length; }
set length(value: number) { this._length = value; }

在 C# 中,我知道你可以这样写:

public length { get; set; }

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

【问题讨论】:

  • 我想知道这样一个 getter/setter 的意义何在? IE。由于 TypeScript 中没有覆盖限制,它们与直接公开字段有何不同?如果关键是要有一个只读字段,为什么不通过属性描述符正确地做到这一点?
  • @billc.cn 在我的例子中,我实际上是在 get/set 函数中添加额外的功能,以便在值更改时触发主对象上的事件。

标签: typescript


【解决方案1】:

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

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;

需要注意的一点是_length 属性将被添加到对象中。如果您不需要访问它,那很好!如果您确实需要使用它,并且希望它自动完成,您可以像这样注释属性:

@prop length = 0; private _length = 0;

【讨论】:

  • +1。此外,分离 getter 和 setter 装饰器并仅在需要时使用它们可能很有用:@get @set length = 0@get id; 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多