打字稿相当于包装范围?

Hob*_*ber 9 typescript typescript2.0

TypeScript中是否有一种方法允许一个文件访问另一个文件中的方法,但不允许它们全局访问?

用例是拥有一个带有一些私有方法的大型类,这些私有方法是危险的,不应公开暴露于可能在代码库中的任何位置使用。我希望能够在另一个文件中编写访问它们的方法,以允许对其进行逻辑分组,而不必将它们全部放在一个巨型类中。

理想情况下,像Java的包范围之类的东西可以让我声明两个文件可以访问彼此的危险方法,但不能访问其他任何人。是否有任何允许使用此功能的TypeScript语言功能?

例:

一个类的方法d1,通过d100这都是危险的,不应该是全局访问。

B类s1通过的方法可以s100对项目内的公众安全使用。每个s方法d在进行一些安全检查后都会调用一个方法。B类需要访问所有d方法。

C类希望调用任何s方法,并且应该能够,但不应调用任何d方法。

但是,据我了解Typescript,如果我导出任何d方法以便B可以调用它们,那么C也可以访问它们。如果是Java,则将A和B放在同一个程序包中,并使d方法成为程序包范围。

在TypeScript中似乎没有与此相似的东西,但是有什么东西可以模拟以下目标:1)能够将功能分解为单独的文件,但2)限制谁可以调用方法?

(是的,我知道一旦将其编译为Javascript,所有的赌注都将消失。目标是仅使用TypeScript作为静态检查器在编译时验证合同。)

And*_*erg 8

没有直接方法可以在Typescript中强制执行此操作。以我的经验,解决此类问题的最佳方法是通过清晰的文档和清晰的命名模式。

如果有一个不熟练或恶意的开发人员,他们将有多种方式来制造破坏,而编译器限制将无济于事。但是,所有合理的技术和道德的开发人员应该能够避免调用内部危险的方法。

我的建议是生成某种命名约定。由于语言限制而公开的所有非API方法/属性/字段均应具有相同的前缀或后缀。

例如,我们团队的工作方式如下:

  1. 所有非API公共方法/属性/字段均以开头_
  2. 所有非API公共类均带有后缀Internal
  3. 所有非API模块都在一个internal文件夹中。例如src/models,具有API的模型模块。src/models/internal 具有不是API的模型模块。
  4. 所有非API类都有注释,将其记录为非API。

此外,我们尚未执行此操作,但正在考虑创建tslint规则以帮助强制执行这些规则。由于我们没有让任何开发人员意外地使用非API,因此我们并没有走太远,但这仍然是可能的。

我认为,适当的命名约定,适当的文档和适当的指导就足以解决此问题,我同意这是对Typescript语言的限制。

  • 我认为主要问题是开发人员没有意识到他们正在触及不应该触及的地方。也许最小的解决方案只是在每个应具有受限范围的外部可访问标识符之前添加前缀“_”。该前缀告诉开发人员,他们需要在使用前仔细检查预期范围。 (2认同)