Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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;
  }
}