typescript - 私有(private)二传手 typescript ?

标签 typescript setter getter-setter accessor

有没有办法在 TypeScript 中为属性设置私有(private) 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 的可见性不匹配。我知道我可以只设置支持字段,但是当设置值时我不能设置断点。

虽然我想用一个接口(interface)来隐藏setter,但是接口(interface)只能定义一个属性,而不能定义它是否有setter上的getter。

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

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

最佳答案

TypeScript 规范 (8.4.3) 说......

Accessors for the same member name must specify the same accessibility

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

您可以没有 setter ,这意味着只有 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!';

可能确保私有(private)访问导致类似于“通知属性更改”模式的东西可以实现的理想方法是拥有一对私有(private)获取/设置属性访问器和一个单独的公共(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';
    }
}

关于typescript - 私有(private)二传手 typescript ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27825350/

相关文章:

node.js - Typescript - 我可以从一个模块到另一个模块输入 "bolt-on"类型吗?

angular - 从 Angular 2 中的历史记录中删除一个组件

c++ - 哪个更合适 : getters and setters or functions?

java - 作业 Java - 语法错误,无法调用数组中的方法。

java - 混淆Java封装概念

javascript - 为什么我无法在 Angular 5 和 TypeScript 中使文本区域部分不可编辑?

javascript - WebGL 帧缓冲区为空白

javascript - ES5 getters 和 setters 是 "potentially surprising and difficult to reason about"

java - 为什么在 Constructor 和 Setters 中使用 "this"关键字?

java - 在 Java 中使用 getter 方法将元素添加到 List 是一种不好的做法吗?