导入内部模块

时间:2015-05-06 14:09:28

标签: typescript

我有一个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'。发生这种情况是因为包含顶级importexport的模块是外部模块,并且外部模块不能跨文件传播;换句话说,它们是密封的,因为它在Scala,C#和其他地方调用。反过来,它意味着文件Base.ts不再对MyNamespace做出贡献。尽管我认为拥有一个通用命名空间并且能够依赖其他 - 外部模块是完全合理的愿望。

我尝试了一些解决方法,但其中没有一个是完美的。

  • 使用var代替import没有顶级导入意味着模块不会变为外部。但是,如果我们使用var导入模块,我们无法在类型位置使用它,只能在值位置使用它。

  • 使所有模块都在外部。基本上,我们删除命名空间,而不是引用依赖它们的文件中的其他模块使用import语句。就像好老#include一样。除了必须执行大量的需求之外,它意味着每个模块都编译成一个单独的文件,现在加载我们需要读取大量文件而不是一个文件的应用程序。

  • 将所有内容保存在一个文件中。解决外部模块的密封性(有这样一个字吗?)的问题。这个适用于小程序,但是文件大于1000行代码会变得无法管理。

  • 创建一个包装器。如果只有几个要导入的模块,并且它们相当小,可以使用var导入它们,并创建委托的包装器功能。显然,不是最干净的解决方案,随着模块数量的增长而变得繁琐。

所以,我的问题是如何正确地将node.js模块导入到一个文件中,该文件包含分布在多个文件中的内部TypeScript模块。此外,我想了解为什么不可能采用我的第一个天真的方法。

1 个答案:

答案 0 :(得分:1)

我的个人建议是你的选择2.

  

将所有模块设为外部

这就是节点设置运行的方式,所以不要打它。是的,它将在您运行应用程序时从本地磁盘加载文件,但它也设置为优化对相同资源的后续请求。

每个文件代表一个模块,因此您不需要在应用中使用module关键字(并且您不需要任何reference条评论 - 只需{{{ 1}}陈述)。如果您希望使用文件夹结构,则可以创建层次结构,尽管我更喜欢高层而不是深层结构。