2015-01-07 17 views
32

C'è un modo per avere un setter privato per una proprietà in TypeScript?Dattiloscritto di setter privato?

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

    private set prop(val: string) 
    { 
     //can put breakpoints here 
     this._prop = val; 
    } 
} 

Il compilatore si lamenta che la visibilità per getter e setter non corrispondono. So che posso solo impostare il campo di supporto, ma ma non riesco a impostare i breakpoint quando il valore è impostato.

Ho pensato di usare un'interfaccia per nascondere il setter, ma le interfacce possono solo definire una proprietà, non se ha un getter sul setter.

Mi manca qualcosa qui? Non sembra esserci alcuna ragione per non permettere ai setter privati, il JS risultante non impone comunque visibilità, e sembra migliore delle alternative attuali.

Mi manca qualcosa? Se no c'è una buona ragione per nessun setter privato?

risposta

30

La specifica dattiloscritto (8.4.3) dice ...

accessor per lo stesso nome del membro deve specificare la stessa accessibilità

Quindi dovete scegliere una valida alternativa. Ecco due opzioni:

Non si può avere un setter, il che significa che solo la classe Test è in grado di impostare la proprietà. È possibile posizionare un punto di interruzione sulla linea 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!'; 

Se si desidera implementare un tipo di meccanismo "notifica proprietà modificata", è possibile utilizzare un metodo privato.

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

Il problema di questa soluzione è che non consentono + = (e - =) Operatore: 'this.prop + = 'abc'; ' – splintor

+0

@splintor yes ma non lasciare che altri cambino il valore è l'intero punto :) –

+0

@TobyJ Notate il' this' che ho usato nel mio esempio. Voglio dire consentire '+ =' e '- =' all'interno della classe, dove puoi impostare un punto di interruzione. La soluzione di @Fenton suggerisce l'aggiunta di un metodo, ma poi all'interno della classe non puoi usare '+ =' per aggiungere a 'prop'. Vedi [la mia soluzione] (https://stackoverflow.com/a/45909300/46635) per un modo per farlo. – splintor

1

Spero anche che potremmo avere getter pubblici e setter privati. Fino a quando lo facciamo, un altro modo per gestire questa situazione è quello di aggiungere ulteriori getter e setter privato:

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; 
    } 
} 
Problemi correlati