Typescript等效的包范围?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Typescript等效的包范围?相关的知识,希望对你有一定的参考价值。
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作为静态检查器来在编译时验证合同。)
在Typescript中没有直接的方法来强制执行此操作。根据我的经验,解决此类问题的最佳方法是通过清晰的文档和明确的命名模式。
如果有一个不熟练的或恶意的开发者,他们将有许多方法来创建破坏和编译器限制将无助于阻止它们。但是,所有合理技术和道德的开发人员都应该能够避免使用内部的,危险的方法。
我的建议是生成某种命名约定。由于语言限制而公开的所有非API方法/属性/字段应具有相同的前缀或后缀。
例如,我们团队的工作方式如下:
- 所有非API公共方法/属性/字段都以
_
为前缀。 - 所有非API公共类都以
Internal
为后缀。 - 所有非API模块都在
internal
文件夹中。例如,src/models
拥有API模型模块。src/models/internal
的模型模块不是API。 - 所有非API类都有一个注释,将它们记录为非API。
此外,我们还没有这样做,但正在考虑创建tslint规则以帮助实施这些规则。我们没有走太远这条道路,因为我们没有任何开发人员意外使用非API,但这仍然是一种可能性。
在我看来,正确的命名约定,适当的文档和适当的指导足以解决这个问题,我同意这是对Typescript语言的限制。
我会使用Rob提出的方法隐藏危险的方法:将类A放在与类B相同的文件中。导出类B,但不要导出类A.这样,类A只对类B可见。当然作为替代方案,你可以创造一个巨大的阶级,但你对这条道路犹豫不决......
您应该注意:TypeScript编译为JavaScript,因此从JavaScript的角度来看,每个不安全的代码都可用于不需要的用法。
TypeScript中没有等效的Java包范围,但有时确实需要它。这是我的解决方案:
export class Foo {
private doSomething(): void {
//do something
}
}
interface FooUnlocker {
doSomething(): void;
}
const foo: Foo = new Foo();
(<FooUnlocker><any>foo).doSomething();
优点 - 需要额外的约定,如_doSomething()等,代码是干净的,我们有编译检查。
缺点 - 我们需要同步Foo和Foo Unlocker。
节点,FooUnlocker未导出,因此仅在模块内可见(如果使用ES6模块)。
以上是关于Typescript等效的包范围?的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript 中的 querySelectorAll 等效项
typescript 手动等效于MaterialModule
Typescript GraphQL 等效于 EnumSet
typescript Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming/angular-2/