Typescript等效的包范围?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Typescript等效的包范围?相关的知识,希望对你有一定的参考价值。

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

这个用例就是有一个大类,有一些危险的私有方法,不应公开暴露在代码库的任何地方。我希望能够在另一个文件中编写访问它们的方法,以便在逻辑上对它们进行分组,而不需要将它们全部放在一个巨大的类中。

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

例:

A类有通过d1的方法d100,这些方法都是危险的,不应该是全球可访问的。

B类有通过s1s100方法,可以在项目中安全地供公众消费。在进行一些安全检查后,每个s方法都会调用d方法。 B类需要访问所有d方法。

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

但是,正如我理解的Typescript,如果我导出任何d方法以便B可以调用它们,那么它们也可以被C访问。如果这是Java,我会将A和B放在同一个包中并生成d方法包范围。

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

(是的,我知道一旦它被编译成javascript,所有的赌注都会关闭。目标是只使用TypeScript作为静态检查器来在编译时验证合同。)

答案

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

如果有一个不熟练的或恶意的开发者,他们将有许多方法来创建破坏和编译器限制将无助于阻止它们。但是,所有合理技术和道德的开发人员都应该能够避免使用内部的,危险的方法。

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

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

  1. 所有非API公共方法/属性/字段都以_为前缀。
  2. 所有非API公共类都以Internal为后缀。
  3. 所有非API模块都在internal文件夹中。例如,src/models拥有API模型模块。 src/models/internal的模型模块不是API。
  4. 所有非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 解析私有范围包的类型

TypeScript 中的 querySelectorAll 等效项

TypeScript hasOwnProperty 等效项

typescript 手动等效于MaterialModule

Typescript GraphQL 等效于 EnumSet

typescript Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming/angular-2/