web-dev-qa-db-ja.com

プライベートセッタータイプスクリプト?

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は可視性を強制せず、現在の選択肢よりも優れているようです。

何か不足していますか?そうでない場合、プライベートセッターがいない正当な理由はありますか?

60
sheamus

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';
    }
}
53
Fenton

また、パブリックゲッターとプライベートセッターがあることを願っています。これを処理するまで、別のプライベート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;
  }
}
4
splintor