gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:29:00 24 4
gpt4 key购买 nike

有没有办法在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com