我注意到TypeScript 2.0将支持只读类属性,但目前还不可用。我写这篇文章的原因是希望能够聪明地编写代码,以便稍后在转换时尽可能少地遇到问题。
我想这样使用一个带有只读属性的类:
在短期内,我可以将属性公开,以便我可以直接访问,但这样会“风险”我可能会直接设置属性 - 或者我可以有私有属性并编写getter和setter。
问题二:如果我选择后者,getter的速度比直接引用属性慢多少?我的一些属性在拖动时会被频繁调用,因此速度很重要。
我想这样使用一个带有只读属性的类:
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和property名称相同,我无法使其工作-因此,我将切换fn名称为setWidth。 我不想给所有只读属性加前缀_,因为过去我发现这样做比键入额外字符的麻烦更大。 由于TS的类型检查,我不需要视觉提醒属性是只读的(或私有的)。
Q1:如果宽度是widget类的只读属性,上述代码在typescript 2中是否有效?
export class widget {
readonly width:number; // doesn't work in TS 1.8
setWidth(w:number) {
this.width = w;
}
}
在短期内,我可以将属性公开,以便我可以直接访问,但这样会“风险”我可能会直接设置属性 - 或者我可以有私有属性并编写getter和setter。
问题二:如果我选择后者,getter的速度比直接引用属性慢多少?我的一些属性在拖动时会被频繁调用,因此速度很重要。
widget.getWidth();
// vs
widget.width;
更新
我最近发现了这个帖子的回答,并意识到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限定符能够直接读取(私有)属性(不通过访问器函数,因此更快),并且我的所有使用代码都不需要更改。有人知道吗?