从几个TypeScript类创build一个CommonJS模块

我试图找出将我的应用程序分割成几个可供其他应用程序使用的CommonJS模块的最佳方法。

我有5个TS类,我想把它们作为一个CommonJS模块捆绑在一起。 然后我打算把这个模块发布到一个私有的NPM库,这样它可以被其他应用程序使用。 理想情况下,我想打包相关的* .d.ts定义文件。

什么是最好的方法来做到这一点? 我正在使用外部TS模块,但是这些模块为每个TS类生成一个单独的CommonJS模块。

据我所知打字稿不支持组合外部模块呢。 从codeplex上的wiki:

TypeScript在外部模块源文件和它们发射的JS文件之间具有一对一的对应关系。 其中一个影响就是无法使用–out编译器开关将多个外部模块源文件连接成一个JavaScript文件。

不过,你可以通过在打字稿中使用内部模块来实现,因为tsc编译器可以将它们编译成单个文件,然后你可以为整个命名空间添加一个带有module.exports指令的文件。它是一个CommonJS模块。

这是一步一步的例子。 假设您将以下内部模块分成三个文件:

Validation.ts

 module Validation { export interface StringValidator { isAcceptable(s: string): boolean; } } 

ZipCodeValidator.ts

 /// <reference path="Validation.ts" /> module Validation { var numberRegexp = /^[0-9]+$/; export class ZipCodeValidator implements StringValidator { isAcceptable(s: string) { return s.length === 5 && numberRegexp.test(s); } } } 

LettersOnlyValidator.ts

 /// <reference path="Validation.ts" /> module Validation { var lettersRegexp = /^[A-Za-z]+$/; export class LettersOnlyValidator implements StringValidator { isAcceptable(s: string) { return lettersRegexp.test(s); } } } 

如果使用tsc compiler的–out参数编译这些参数,则可以将它们合并到一个文件中。 但是,这并不能使它们成为CommonJS模块。 要导出它们,您可以使用一个技巧来添加一个名为ValidationExport.ts的 ts文件,其中包含命名空间的导出指令:

 var module: any = <any>module; module.exports = Validation; 

然后你可以运行tsc命令将所有东西编译成一个名为“validationmodule.js”的文件:

 tsc --out validationmodule.js Validation.ts ZipCodeValidator.ts LettersOnlyValidator.ts ValidationExport.ts 

输出是一个可以在Node.js中使用的CommonJS模块:

 var Validation = require("./validationmodule"); var zipCodeValidator = new Validation.ZipCodeValidator(); var lettersOnylValidator = new Validation.LettersOnlyValidator(); console.log(zipCodeValidator.isAcceptable("16211")); console.log(lettersOnylValidator.isAcceptable("5555")); 

为每个文件分配一个CommonJS模块是完全合适的。 在TypeScript中所有require调用都将转换为JavaScript中的CommonJS require请求调用,并且.d.ts文件将在过程中被拾取。 (如果你正在做一些愚蠢的事情,比如require源代码目录之外的类… stop。)

如果您打算在其他应用程序中使用此NPM软件包,则只​​需考虑一个打包步骤,在这种情况下可以查看Browserify