【发布时间】:2015-05-06 14:09:28
【问题描述】:
我有一个 node.js 应用程序。与所有重要的应用程序一样,它被拆分为许多文件。为简单起见,假设有两个文件:
Base.ts
module MyNamespace {
export class Base {}
}
Derived.ts
/// <reference path="Base.ts" />
module MyNamespace {
export class Derived extends Base {}
}
在 TypeScript 的术语中,它们是内部模块。现在,我想在文件 Derived.ts 中使用 node.js 模块。天真的方法是只导入它。
/// <reference path="Base.ts" />
/// <reference path="node.d.ts" />
import fs = require('fs');
module MyNamespace {
export class Derived extends Base {
stats: fs.Stats;
}
}
但是,如果我们尝试编译此代码,我们将收到错误 2304 Cannot find name 'Base'。发生这种情况是因为包含顶级import 或export 的模块是外部模块,并且外部模块不能跨文件传播;换句话说,它们是密封的,因为它在 Scala、C# 以及也许在其他地方被调用。反过来,这意味着文件Base.ts 不再对MyNamespace 有贡献。尽管我相信拥有一个公共命名空间并能够依赖其他外部模块是完全合理的愿望。
我尝试了一些解决方法,但没有一个是完美的。
使用
var而不是import。 没有顶级导入意味着模块不会成为外部模块。但是,如果我们使用var导入模块,我们将无法在类型位置使用它,只能在值位置使用它。将所有模块设为外部。 基本上,我们会删除命名空间,而不是使用
import语句来引用依赖于它们的文件中的其他模块。就像好老#include。除了必须做大量的要求之外,这意味着每个模块都编译成一个单独的文件,现在要加载应用程序,我们需要读取很多文件而不是一个文件。将所有内容保存在一个文件中。解决了外部模块的密封性问题(有这个词吗?)。这对小程序很有用,但是文件超过 1000 行代码就会变得难以管理。
创建一个包装器。如果您只有几个模块要导入,而且它们很小,您可以使用
var导入它们,并创建委派功能的包装器.显然,这不是最干净的解决方案,并且随着模块数量的增加变得很麻烦。
所以,我的问题是如何正确地将 node.js 模块导入到包含分布在多个文件中的内部 TypeScript 模块的文件中。另外,我想了解为什么不能采用我的第一个天真的方法。
【问题讨论】:
标签: typescript