是否可以将命名空间声明与任何类型的导入合并?

时间:2017-05-24 03:54:45

标签: typescript

我一直在寻找一些方法来减少导入依赖关系的样板,并偶然发现了Typescript命名空间以及它们如何在多个文件中合并。例如:

foo.ts

namespace app {
  const foo = bar() // foo is 42 now
}

bar.ts

namespace app {
  export function bar() {
    return 42
  }
}

只要将两个文件都添加到Typescript项目中,它就可以正常编译,并且根据捆绑和/或执行的方式,甚至可以正常运行(源文件的顺序在这里很重要)。我发现它令人耳目一新,我不必为每个依赖项键入一个import语句。将所有内容放在一个命名空间中可能会因为简单的Javascript而疯狂,但我认为它就像一个带有Typescript的魅力,因为它可以跟踪所有符号以及它们的使用位置。

现在,只要在任何来源中没有导入或导出语句,这只会起作用。第二个我尝试导入一个外部库,该源文件成为自己的模块,命名空间不再自动与另一个合并。

使用require仍然有效,但没有很好的方法来获取导入的类型。

如何使用此命名空间与外部导入合并?

2 个答案:

答案 0 :(得分:1)

没有。

javascript中的每个模块,因此在typescript中,是一个单独的,孤立的命名空间。

对每个依赖项都有明确的import语句是模块化编程的全部内容。目的是使每个模块成为一个小的,自包含的代码片段,具有最小的必要依赖性。许多好的node.js包都遵循这种风格。

您所描述的内容看起来完全不同 - 当您拥有大量代码时,从任何地方访问所有内容确实看起来很方便,而不考虑依赖性。但是,模块并不适合这种风格。

答案 1 :(得分:0)

这是克服我迄今为止发现的导入问题的一种可能方法。

<强> external.d.ts

In [197]: y_test
Out[197]: array([0, 2, 0, ..., 0, 0, 1])

In [198]: clf.predict(X_test)
Out[198]: array([2, 2, 2, ..., 2, 2, 2])

In [199]: y_test == clf.predict(X_test)
Out[199]: array([False,  True, False, ..., False, False, False], dtype=bool)

In [200]: clf.score(X_test, y_test)
Out[200]: 0.3125

在主应用代码中,只需像往常一样使用import * as events from "events" import * as ts from "typescript" declare global { // if using @types/node interface NodeRequireFunction { (id: "events"): typeof events } // if declaring your own require function function require(id: "typescript"): typeof ts } 功能。

<强> main.ts

require

这增加了一些样板,但至少每个外部模块只有一次。应用程序代码可以导出所需的模块,使它们随处可访问。