我一直在寻找一些方法来减少导入依赖关系的样板,并偶然发现了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
仍然有效,但没有很好的方法来获取导入的类型。
如何使用此命名空间与外部导入合并?
答案 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
这增加了一些样板,但至少每个外部模块只有一次。应用程序代码可以导出所需的模块,使它们随处可访问。