2015-01-07 3 views
32

Есть ли способ иметь частный сеттер для свойства в 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 не обеспечивает видимости в любом случае, и кажется лучше, что нынешние альтернативы.

Я что-то упустил? Если нет, то нет веских оснований для каких-либо частных разработчиков?

ответ

30

Спецификация машинопись (8.4.3) говорит, что ...

Accessors для того же имени элемента необходимо указать тот же доступ

Таким образом, вы должны выбрать подходящую альтернативу. Вот два варианта для вас:

Вы можете просто не иметь сеттер, что означает, что только класс 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'. См. [Мое решение] (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; 
    } 
}