[解決済み] プライベートセッターのタイプスクリプト?
質問
TypeScriptでプロパティのプライベートセッターを持つ方法はありますか?
class Test
{
private _prop: string;
public get prop() : string
{
return this._prop;
}
private set prop(val: string)
{
//can put breakpoints here
this._prop = val;
}
}
ゲッターとセッターの可視性が一致しないとコンパイラが文句を言う。バッキングフィールドを設定すればいいのはわかるのですが、そうすると値が設定されたときにブレークポイントを設定することができないのです。
インターフェイスを使ってセッターを隠すことも考えましたが、インターフェイスはプロパティしか定義できず、セッターとゲッターを持つかどうかはわかりません。
私はここで何かを見逃しているのでしょうか?プライベートなセッターを許可しない理由はないように思われますし、結果として生じる JS はとにかく可視性を強制しませんし、現在の代替案よりも良いように思われます。
私は何かを見逃しているのでしょうか?そうでなければ、プライベートなセッターを許可しない良い理由がありますか?
どのように解決するのですか?
TypeScriptの仕様書(8.4.3)には...とあります。
同じメンバー名のアクセサーは、同じアクセシビリティを指定する必要がある
ですから、適切な代替手段を選択する必要があります。ここでは、2つの選択肢を紹介します。
セッターを持たなければいいのです。
Test
クラスだけがプロパティを設定できることを意味します。という行にブレークポイントを置くことができます。
this._prop =...
.
class Test
{
private _prop: string;
public get prop() : string
{
return this._prop;
}
doSomething() {
this._prop = 'I can set it!';
}
}
var test = new Test();
test._prop = 'I cannot!';
おそらく、プライベートアクセスが "notify property changed" パターンのようなものを確実に実装できる理想的な方法は、一対のプライベート get/set property アクセサと、別のパブリック get property アクセサを持つことでしょう。
あなたはまだ、誰かが後でバッキングフィールドに直接呼び出すことを追加することに注意する必要があります。そのあたりを工夫して、その可能性を低くしようとすることもできます。
class Test
{
private _nameBackingField: string;
private get _name() : string
{
return this._nameBackingField;
}
private set _name(val: string)
{
this._nameBackingField = val;
// other actions... notify the property has changed etc
}
public get name(): string {
return this._name;
}
doSomething() {
this._name += 'Additional Stuff';
}
}
関連
-
[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
-
[解決済み】TypeScriptのインターフェースと型について
-
[解決済み] ユニオン型からインターセクション型への変換
-
[解決済み] インターフェース定義でゲッター/セッターを使用することは可能ですか?
-
[解決済み] TypeScript "this" scoping issue when called in jquery callback.
-
[解決済み] TypeScript Genericsに複数の型制約を指定することは可能か?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ユニオン型からインターセクション型への変換
-
[解決済み] グローバルスコープの拡張は、外部モジュールまたはアンビエントモジュール宣言にのみ直接ネストすることができます(2669)
-
[解決済み] ngForとAsync Pipe Angular 2でObservableオブジェクトから配列を利用する。
-
[解決済み] typescriptでmoment.jsをインポートするには?
-
[解決済み] TypeScriptをminifiedコードにコンパイルすることは可能ですか?
-
[解決済み] TypeScriptで強く型付けされた配列の作成
-
[解決済み] 他のプロパティを使用できる TypeScript インターフェース
-
[解決済み] タイプスクリプトでenumをインデックスキーとして使用するには?
-
[解決済み] types/packageでインストールしたTypeScriptの型定義が正しくない場合に上書きする方法
-
[解決済み] TypeScriptの"=>"の意味とは?(ファットアロー)