【发布时间】:2017-05-15 05:12:17
【问题描述】:
TypeScript 中有没有一种方法可以允许一个文件访问另一个文件中的方法,但不能让它们全局访问?
这个用例是有一个带有一些私有方法的大型类,这些方法很危险,不应该公开暴露在代码库的任何地方可能使用。我希望能够在另一个文件中编写访问它们的方法,以允许在逻辑上对它们进行分组,而不会将它们全部放在一个巨大的类中。
理想情况下,像 Java 的包范围这样的东西可以让我声明这两个文件可以访问彼此的危险方法,但不能访问其他任何人。是否有任何允许这样做的 TypeScript 语言功能?
例子:
A 类具有 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 作为静态检查器来在编译时验证合约。)
【问题讨论】:
-
为什么不把
A类和B类放在同一个文件中,并且不导出A? -
@Rob 现在就是这样。这两个类都在变大,最简单的重构就是将它们分成两个文件。
-
丑陋的部分解决方法,使用
/** @internal **/隐藏.d.ts文件中的内容。虽然有an open proposal,但似乎还没有什么好的方法可以做到这一点 -
我在其他语言中看到的一种风格是将私有内容放在名称为
mypkg/internal或mypkg/private的“内部”模块中。虽然内部模块在技术上仍然是公开的,但很明显“不要导入这个!”图书馆客户的信号 -
如果你没有用 export 标记一个类,并在模块中声明它,在与使用它的类相同的文件中,tsc 编译。将类放在另一个文件中,它找不到它。