在组合中共享私有成员

问题描述 投票:0回答:1

假设我有两节课:

class Element {
    parent: Manager;
    get() {
        parent.table();
    }
}
class Manager {
    run(){}
    table(){}
}

但是,说这是一个库,

run()
Manager
唯一应该公开的方法。如果用户运行
table()
,灾难就会随之而来。我们可以将
table()
设为私有,

export class Manager {
    run(){}
    private table(){}
}

但这显然会导致

Element
尝试调用
table()
出现问题。这应该如何组织?

有人告诉我,在这种事情上加下划线前缀是常见的做法,以表示不敏感,例如

export class Manager {
    run(){}
    _table(){}
}

这有效!虽然我很好奇是否有更强大的替代方案。

我也考虑过使用函数而不是方法,即

function table(manager: Manager) {}

export class Manager {
    run(){}
}

尽管这使得其他

Manager
私人成员无法在
table()
中使用。

typescript code-organization
1个回答
0
投票

使用索引属性表示法来获取类的私有成员。它是由 TypeScript 团队特意制作的,作为边缘情况的解决方法,在这种情况下,除了访问私有成员之外别无选择。它将非常容易阅读,不需要额外的代码,而且看起来很简单: class Element { parent: Manager; get() { const res = this.parent['table'](); res satisfies string; // It also correctly resolves all the typings } } class Manager { private table(): string{ return '' } }

一点旁注:最好还是设计代码,使两个独立的类不需要通过私有方法相互交互,因为类应该是独立的、独立的“活物”,它也使得unit和集成测试要困难得多。除此之外,将来,随着

EcmaScript Private Class Fields的采用,这些类型的解决方法将是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.