从多个TypeScript类创建单个CommonJS模块

LJW*_*LJW 10 commonjs node.js typescript grunt-ts

我正在尝试找出将应用程序拆分为几个可供其他应用程序使用的CommonJS模块的最佳方法.

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

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

Far*_*ina 15

据我所知,typescript不支持组合外部模块.从他们在codeplex上的wiki:

TypeScript在外部模块源文件与其发出的JS文件之间具有一对一的对应关系.这样做的一个影响是不可能使用--out编译器开关将多个外部模块源文件连接成一个JavaScript文件.

但是,你可以通过在typescript中使用内部模块来做一个技巧,因为tsc编译器能够将它们编译成单个文件,然后你可以添加一个带有module.exports整个命名空间的指令的文件,使它成为一个CommonJS模块.

这是一个循序渐进的例子.假设您将以下内部模块拆分为三个文件:

验证.ts:

module Validation {
    export interface StringValidator {
        isAcceptable(s: string): boolean;
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var module: any = <any>module;
module.exports = Validation;
Run Code Online (Sandbox Code Playgroud)

然后你可以运行tsc命令将所有内容编译成一个名为"validationmodule.js"的文件:

tsc --out validationmodule.js Validation.ts ZipCodeValidator.ts LettersOnlyValidator.ts ValidationExport.ts
Run Code Online (Sandbox Code Playgroud)

输出是您可以在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"));
Run Code Online (Sandbox Code Playgroud)