Частный сеттер 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 не обеспечивает видимость в любом случае, и кажется лучше, что существующие альтернативы.
Я что-то упустил? Если нет, то нет никаких оснований для отсутствия частных разработчиков?
Ответы
Ответ 1
В спецификации TypeScript (8.4.3) говорится...
Аксессоры для одного и того же имени участника должны указывать ту же доступность
Итак, вам нужно выбрать подходящую альтернативу. Вот два варианта для вас:
У вас может не быть сеттер, что означает, что только класс 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
Я также надеюсь, что у нас может быть публичный геттер и частный сеттер. До тех пор, пока мы это сделаем, еще один способ справиться с этим - добавить дополнительный частный приемник и сеттер:
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;
}
}