包装许多内部模块以便在typescript中导出

Gro*_*fit 7 amd node.js typescript

我正在寻找在节点内使用typescript,我目前习惯通过///<reference.../>语法纯粹使用内部模块来使用typescript .但是对于较大的项目,这可能会变得难以处理,因为您可以使用引用其他模块的模块,这些模块都具有相互链接的引用.

所以对于这个节点项目,我正在考虑尝试将所有逻辑组件分组为内部模块/类,就像之前一样,因此它们将在内部相互引用,但是通过一个外部模块公开它们,这将暴露底层类等.

这种方式的语法与现有需要机制的节点非常相似,例如:

import database = require("my-external-db-module.ts");
var connection = new database.Connection(someUrl);
Run Code Online (Sandbox Code Playgroud)

而不是

///<reference path="my-internal-db-modules.ts" />
var connection = new Database.Connection(someUrl);
Run Code Online (Sandbox Code Playgroud)

我想像语法会是这样的:

///<reference path="all-my-internal-module-files-etc.ts" />
///<reference path="..." />
export module SomeExposingModule
{
   // Not quite sure what to put in here to expose the internal modules
}
Run Code Online (Sandbox Code Playgroud)

那么有什么样的最佳实践围绕这类事情或任何其他类似的东西,或者每个人都只是坚持使用内部模块来处理复杂的东西?

Gro*_*fit 5

我不确定这是不好的做法,但这是我如何解决我的问题.

首先快速总结一下问题:

我有多个文件在逻辑上分组在命名空间下,例如Framework那里的所有文件都将是Framework.*,例如Framework.DatabaseFramework.UnitOfWork.然后这些都是通过编译tsc --out framework.js ...所以我将所有这些输出到一个framework.js文件中.

现在上面听起来很好,但是它不允许你在使用--out时导出模块,因为它跨越多个文件,所以为了节点工作,我需要以某种方式导出模块,所以我基本上附加了一个额外的打字稿文件,手动做这对我来说在汇编中:

// exporter.ts
module.exports = Framework;
Run Code Online (Sandbox Code Playgroud)

因此,提供这是添加到tsc编译中的最后一个文件,您将最终得到如下内容:

// Framework.js
var Framework;
(function (Framework) {
    // lots of good stuff
})(Framework || (Framework = {}));
module.exports = Framework;
Run Code Online (Sandbox Code Playgroud)

因此,这将导出内部模块正常,并且现在将包含导出声明,因为现在包含了exporter.ts文件.

所以我不确定这是不是很糟糕的做法,但是这让我可以充分利用两个世界,一个可重用的模块,它是用命名空间布局的,并且分布在一个合理的文件结构中,以及一个编译的单个模块,它可以是包括引用或nodejs require.

因此用法如下:

var Framework = require("./framework");
var database = new Framework.Database.DbConnection();
Run Code Online (Sandbox Code Playgroud)