私人二传手打字稿?


77

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

我虽然打算使用接口来隐藏设置器,但是接口只能定义属性,而不能定义设置器上是否具有getter。

我在这里想念什么吗?似乎没有任何理由不允许使用私有设置器,因此生成的JS无论如何都不会强制执行可见性,并且与当前的替代方法相比似乎更好。

我想念什么吗?如果没有,那么没有私下的二传手有充分的理由吗?

Answers:


73

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!';

确保可以实现类似于“通知属性更改”模式的某种方式的私有访问的理想方法是拥有一对私有的get / set属性访问器和一个单独的public get属性访问器。

您仍然需要对以后向该字段添加直接呼叫的人保持谨慎。您可以在该领域发挥创意,以减少这种可能性。

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

2
此解决方案的问题在于他们不允许+ =(和-=)运算符:this.prop += 'abc';
splintor

3
@splintor是的,但不允许其他人更改值才是要点:)
Tobias J

@TobyJ请注意this我在示例中使用的。我的意思是允许+=-=在班级内部设置断点。@Fenton解决方案建议添加一个方法,但是从该类内部,您不能使用+=添加到prop。请参阅我的解决方案以了解解决方法。
splintor

您可以使用第一个示例中的@splintorthis._prop += 'I can set it!';
Fenton,

@Fenton当然可以,但是如果我想让设置者做的不只是设置_prop字段,例如call notify('_prpo', value),那么_prop直接设置就不会做。
夹板

8

我也希望我们可以有公共获取者和私有获取者。在执行此操作之前,另一种处理方法是添加其他私有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;
  }
}

哇,这很聪明!我不知道我们可以为同一个属性使用多个访问器。
S.TarıkÇetin20年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.