2015-01-07 5 views
32

TypeScriptのプロパティに専用のセッターを持たせる方法はありますか?プライベートセッター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は、とにかく可視性を強制せず、現在の選択肢よりも優れているようです。

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

答えて

30

活字体仕様(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!'; 

あなたは「変更されたプロパティを知らせる」仕組みのようなものを実装したい場合、あなたはプライベートメソッドを使用することができます。

class Test 
{ 
    private _prop: string; 
    public get prop() : string 
    { 
     return this._prop; 
    } 

    private setProp(value: string) { 
     this._prop = value; 
     //notify('_prop', value); 
    } 

    doSomething() { 
     this.setProp('I can set it!'); 
    } 
} 

var test = new Test(); 

test.setProp('I cannot!'); 
+2

この解決法の問題点は、+ =(および - =)演算子に 'this.prop + = 'abc'; ' – splintor

+0

@splintorはい、他の人に値を変更させないようにしています:) –

+0

@TobyJ私のサンプルで使用した' this'に注目してください。私は '+ ='と ' - ='をクラス内から許可して、ブレークポイントを設定することができます。 @Fentonソリューションはメソッドを追加することを提案しますが、クラス内からは '+ ='を使用して 'prop'に追加することはできません。方法は[my solution](https://stackoverflow.com/a/45909300/46635)を参照してください。 – splintor

1

私は、パブリックゲッターとプライベートセッターを持つこともできます。これを処理する別の方法は、プライベートゲッターとセッターを追加することです:

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; 
    } 
} 
関連する問題