我注意到typescript 2.0将支持readonly类属性,但它还不可用。这篇文章的原因是我希望能够明智地知道我今天如何编写代码,这样我就可以在以后轻微过渡它。
我想以这种方式使用具有只读属性的类:
let widget = new Widget(110, 220); // width, height
//...
widget.width(200); // to modify the width, I use a setter with validation
widget.width = 300; // note: I want this to be a compile time error
//...
let w = widget.width; // and later I want to get/draw the current width
...但由于fn和属性具有相同的名称,我无法使其工作 - 所以我将fn名称切换为setWidth。我宁愿不用_前缀我所有的readonly属性,因为在过去我发现痛苦不仅仅是键入额外字符的麻烦。由于TS的类型检查,我不需要视觉提醒,即该属性是只读(或私有)。
Q1:如果width是widget类的readonly属性,那么上面的工作在typescript 2中会如下所示吗?
export class widget {
readonly width:number; // doesn't work in TS 1.8
setWidth(w:number) {
this.width = w;
}
}
在短期内,我可以将该物业公之于众,以便我可以直接进入,并承担风险。我可以直接设置属性 - 或者我可以拥有私有属性并编写getter和setter。
Q2:如果我选择后者,那么getter比直接属性引用慢多少?在拖动时,我的一些属性会被频繁调用,因此速度非常重要。
widget.getWidth();
// vs
widget.width;
更新
我最近发现this posted answer并意识到TS已经支持了我尝试做的大部分工作:
export class Widget {
private _width:number;
set width(w) {if (w >= 0) this._width = w}
get width() {return this._width}
}
用法语法与没有访问者的公共属性相同,这非常有趣:
let widget = new Widget(...);
let existingWidth = widget.width;
widget.width = newWidth;
我希望TS2的readonly限定符能让我直接读取(私有)属性(不是通过访问器功能,所以更快),我的使用代码都不需要更改。有人知道吗?
答案 0 :(得分:7)
现在我正在使用TS2,我发现readonly不是我想要的,因为即使在类内部也只能应用只读限制。所以我能想到的最好的方法是使用private修饰符并编写一个显式的getter方法。这是不幸的,原因有两个:读取速度(推测),getter方法名称必须与私有变量的名称不同。