1. ホーム
  2. typescript

[解決済み] プライベートセッターのタイプスクリプト?

2023-03-18 02:03:54

質問

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