有没有办法在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的可见性不匹配.我知道我可以只设置backing字段,但是当设置值时,我不能设置断点.

我考虑过使用接口隐藏setter,但接口只能定义属性,而不能定义setter上是否有getter.

我错过什么了吗?似乎没有任何理由不允许使用私有setter,最终的JS不会强制实现可见性,而且似乎比当前的替代方案更好.

我错过什么了吗?如果不是的话,有没有一个很好的理由没有私有二传?

推荐答案

打字脚本规范(8.4.3)说...

相同成员名称的访问器必须指定相同的可访问性

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

您不能使用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!';

确保私有访问结果类似于"notify property changed"模式的理想方式可能是实现一对私有get/set属性访问器和一个单独的公共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';
    }
}

Typescript相关问答推荐

您可以创建一个类型来表示打字员吗

APP_INITIALIZER—TypeError:appInits不是函数

仅针对某些状态代码重试HTTP请求

编剧错误:正在等待Expect(Locator).toBeVisible()

如何在Type脚本中动态扩展函数的参数类型?

分解对象时出现打字错误

类型TTextKey不能用于索引类型 ;TOption

AngularJS服务不会解析传入的Json响应到管道中的模型

为什么ESLint会抱怨函数调用返回的隐式`any`?

刷新时保持当前名称的Angular

如何在使用条件类型时使用void

TypeScrip错误:为循环中的对象属性赋值

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

为什么TS2339;TS2339;TS2339:类型A上不存在属性a?

接口中可选嵌套属性的类型判断

如何键入对象转换器

在REACT查询中获取未定义的isLoading态

如何为对象数组中的每个条目推断不同的泛型

如何使用动态生成的键和值定义对象的形状?

递归类型名称