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;
}
}
コンパイラは、getterとsetterの可視性が一致しないと文句を言います。バッキングフィールドを設定することはできますが、値が設定されたときにブレークポイントを設定することはできません。
私はインターフェイスを使用してセッターを非表示にすることを考えていますが、インターフェイスはプロパティを定義できるだけで、セッターにゲッターがあるかどうかは定義できません。
ここに何かが足りませんか?プライベートセッターを許可しない理由はないようで、結果の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!';
おそらく、「プロパティ変更の通知」パターンに似たプライベートアクセスの結果を実装できるようにする理想的な方法は、プライベートget/setプロパティアクセサのペアと、別のパブリックgetプロパティアクセサを持つことです。
誰かが後でバッキングフィールドに直接呼び出しを追加することに注意する必要があります。その領域で創造性を発揮して、可能性を低くすることができます。
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';
}
}
また、パブリックゲッターとプライベートセッターがあることを願っています。これを処理するまで、別のプライベートgetterおよびsetterを追加する方法があります。
class Test {
_prop: string;
public get prop(): string {
return this._prop;
}
private get internalProp(): string {
return this.prop;
}
private set internalProp(value: string) {
this._prop = value;
}
private addToProp(valueToAdd: string): void {
this.internalProp += valueToAdd;
}
}