我有一个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模块。此外,我想了解为什么不可能采用我的第一个天真的方法。
答案 0 :(得分:1)
我的个人建议是你的选择2.
将所有模块设为外部
这就是节点设置运行的方式,所以不要打它。是的,它将在您运行应用程序时从本地磁盘加载文件,但它也设置为优化对相同资源的后续请求。
每个文件代表一个模块,因此您不需要在应用中使用module
关键字(并且您不需要任何reference
条评论 - 只需{{{ 1}}陈述)。如果您希望使用文件夹结构,则可以创建层次结构,尽管我更喜欢高层而不是深层结构。