首页 文章

typescript readonly类的属性

提问于
浏览
7

我注意到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;

UPDATE

我最近发现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限定符能够直接读取(私有)属性(不是通过访问器函数,所以更快),并且我的使用代码都不需要更改 . 谁知道?

1 回答

  • 7

    现在我正在使用TS2,我发现readonly不是我想要的,因为只读限制适用于类内部 . 所以我能想到的最好的方法是使用private修饰符并编写一个显式的getter方法 . 这很不幸有两个原因:读取的速度(推测),以及getter方法名称必须与私有变量的名称不同 .

相关问题