私人二传手打字稿?

Private setter typescript?

有没有办法为 TypeScript 中的属性设置私有 setter?

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 的可见性不匹配。我知道我可以只设置支持字段,但是当设置值时我不能设置断点。

我想用一个接口来隐藏setter,但是接口只能定义一个属性,不能定义它是否有getter on setter。

我是不是漏掉了什么?似乎没有任何理由不允许私有设置器,生成的 JS 无论如何都不强制可见性,而且似乎比当前的替代方案更好。

我错过了什么吗?如果不是,是否有充分的理由不使用私人二传手?

TypeScript 规范 (8.4.3) 说...

Accessors for the same member name must specify the same accessibility

所以你必须选择一个合适的替代方案。这里有两个选项供您选择:

你可以没有 setter,这意味着只有 Test class 可以设置 属性。您可以在行 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!';

可能确保私有访问结果类似于 "notify property changed" 模式可以实现的理想方法是拥有一对私有 get/set 属性 访问器,以及一个单独的public 获取 属性 访问器。

你还是要小心后面有人在后台添加直接调用。您可以在该领域发挥创意,尝试降低这种可能性。

class Test
{
    private _nameBackingField: string;

    private get _name() : string
    {
        return this._nameBackingField;
    }

    private set _name(val: string)
    {
        this._nameBackingField = val;
        // other actions... notify the property has changed etc
    }

    public get name(): string {
        return this._name;
    }

    doSomething() {
        this._name += 'Additional Stuff';
    }
}

我也希望我们能有publicgetter和私人setter。在我们这样做之前,另一种处理方法是添加额外的 private getter 和 setter:

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