7

我正在考虑在节点中使用打字稿,目前习惯于通过///<reference.../>纯粹使用内部模块的语法来使用打字稿。然而,对于较大的项目,这可能会变得笨拙,因为您可以让模块引用其他模块,这些模块都具有相互链接的引用。

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

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

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

而不是

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

我想语法会是这样的:

///<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
}

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

4

3 回答 3

5

我不确定这是否是不好的做法,但这是我解决问题的方法。

首先再次快速总结问题:

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

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

// exporter.ts
module.exports = Framework;

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

// Framework.js
var Framework;
(function (Framework) {
    // lots of good stuff
})(Framework || (Framework = {}));
module.exports = Framework;

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

所以我不确定这是否是不好的做法,但这让我可以两全其美,一个可重用的模块,它使用命名空间布局并分布在一个合理的文件结构中,以及一个编译的单个模块,可以通过引用或 nodejs 要求包含。

所以用法看起来像:

var Framework = require("./framework");
var database = new Framework.Database.DbConnection();
于 2013-07-31T10:27:44.233 回答
2

有一些想法可以帮助解决其中的一些问题。

如果您有很多参考资料,您可以使用参考文件来管理它们。例如:

参考文献.ts

///<reference path="a.ts" />
///<reference path="b.ts" />
///<reference path="c.ts" />
///<reference path="d.ts" />

所有其他文件...

///<reference path="references.ts" />

您现在有一个参考文献的中央列表,这比在每个文件的顶部编织参考文献列表要容易得多。

在您的特定情况下,我更倾向于使用import语句并让 NodeJS 为我加载模块 - 我会使用文件系统对模块进行分组。

于 2013-07-18T12:17:28.583 回答
1

您可以做的是将一组 TS 文件编译成 .js + d.ts 组合。例如以下创建out.jsout.d.ts

tsc a.ts b.ts --out mod.js --declaration

然后(希望)以下将起作用:

///<reference path="mod.d.ts">
var mod = require('mod')
于 2013-07-18T10:07:30.200 回答