2016-03-23 30 views
6

typescript 2.0が読み取り専用クラスのプロパティをサポートすることに気付きましたが、まだ利用できません。この投稿の理由は、今日私がコードを書く方法について賢明にしたいので、後で最小の痛みでそれを移行できるようにすることです。typescriptクラスの読み取り専用プロパティ

が、私はこのよう読み取り専用プロパティを持つクラスを使いたい:

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:幅が以下のようにウィジェットクラスの読み取り専用プロパティである場合、上記は2の型で動作しますか?短期的には

export class widget { 
    readonly width:number; // doesn't work in TS 1.8 

    setWidth(w:number) { 
     this.width = w; 
    } 
} 

私が直接アクセスできるように、私は私が直接プロパティを設定する可能性がある「リスク」で、プロパティを公開することができますどちらか - または私はプライベートプロパティと書き込みゲッターとセッターを持つことができます。

Q2:私が後者を行う場合、ゲッターは直接プロパティ参照よりどれだけ遅いですか?私の物件の中にはドラッグしている間に非常に頻繁に呼び出されるものもあるので、速度が重要です。

widget.getWidth(); 
// vs 
widget.width; 

私は最近this posted answerを発見し、それは私がやろうとしていたもののほとんどをサポートし、すでにTS実現UPDATE

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

プロパティアクセサーは20倍遅くなる可能性があり、パフォーマンスはブラウザによって大きく異なります。 次のjsPerfを参照してください - https://jsperf.com/data-vs-accessor-vs-getter-setter/2 – bnieland

+0

jsperf(その最新バージョン)を実行しましたが、操作/秒数は非現実的に高いようです。私のマシン上のFirefoxが1ナノ秒未満でゲッター機能を実行していることがわかります。私のMacの4つのコアに自動的に作業を広げない限り、可能ではないように思われます。その場合、4〜5ナノ秒ですが、まだ現実的ではないようです。 – bedouger

+0

あなた自身のテストを書くのは簡単です。プロパティーゲッターを使用した場合と比較して100,000時間のデータ値にアクセスするにはどのくらい時間がかかりますか? – bnieland

答えて

6

私はTS2を使用しているので、読み取り専用の制限がクラス内であっても適用されるため、読み取り専用ではないことがわかりました。だから私が思いつくことができる最高のは、プライベート修飾子を使用して、明示的なゲッターメソッドを書くことです。これは、2つの理由から残念です。読み込み速度(おそらく)とゲッターメソッド名は、プライベート変数の名前と異なる必要があります。

+0

のように、コンストラクタの外で読み取り専用の値を初期化する方法がないようです。 C#にはmyThing = new Thing(){param = val、param2 = val2}がありますが、typescriptはまだありません。 –

+0

私は、あなたが特定の根拠を持っていない限り、アクセスの速度について心配しません。命名については、ゲッターには 'property_name'を、プライベート変数には '_property_name'を使用してください。プライベートメンバーのための主要なアンダースコアは、ほとんどの言語でよく認められている大会です。 – Neutrino

関連する問題