Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从几个TypeScript类创建单个CommonJS模块_Node.js_Typescript_Commonjs_Grunt Ts - Fatal编程技术网

Node.js 从几个TypeScript类创建单个CommonJS模块

Node.js 从几个TypeScript类创建单个CommonJS模块,node.js,typescript,commonjs,grunt-ts,Node.js,Typescript,Commonjs,Grunt Ts,我正试图找出将我的应用程序拆分为几个可供其他应用程序使用的通用JS模块的最佳方法 我有5个TS类,我想将它们打包为一个CommonJS模块。然后,我打算将此模块发布到一个私有NPM repo,以便其他应用程序可以使用它。理想情况下,我想用它打包相关的*.d.ts定义文件 最好的方法是什么?我正在使用外部TS模块,但这些模块会为每个TS类生成一个单独的CommonJS模块。据我所知,typescript还不支持组合外部模块。从他们在codeplex上的wiki: TypeScript在外部模块源文

我正试图找出将我的应用程序拆分为几个可供其他应用程序使用的通用JS模块的最佳方法

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


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

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

TypeScript在外部模块源文件和它们发出的JS文件之间有一对一的对应关系。这样做的一个效果是不可能使用--out编译器开关将多个外部模块源文件连接到单个JavaScript文件中

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

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

验证。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);
        }
    }
}
/// <reference path="Validation.ts" />
module Validation {
    var lettersRegexp = /^[A-Za-z]+$/;
    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string) {
            return lettersRegexp.test(s);
        }
    }
}
然后可以运行tsc命令将所有内容编译为一个名为“validationmodule.js”的文件:

输出是可以在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
文件。(如果你正在做一些愚蠢的事情,比如
要求
在你的源代码目录之外创建类……停止。)


<>你只需要考虑一个打包步骤,如果你打算在其他应用程序中使用这个NPM包,在这种情况下查看

谢谢,非常好的响应。我想这就引出了一个问题:使用内部模块的缺点是什么?我不久前就停止使用它们了,因为管理脚本依赖关系是一件差事。内部模块只是名称空间。它们不应该对代码造成任何限制。在我上面的示例中,您有脚本依赖项,并且工作正常。如果您有一个更复杂的依赖项场景无法工作,您可以将其作为问题发布;)我在实施此解决方案时遇到问题。具体来说,当我运行行
tsc--out validationmodule.js Validation.ts[…]ValidationExport.ts
时,tsc在尝试处理
ValidationExport.ts
时会引发错误
TS2304:找不到名称“module”。
!我正要发布一个类似的修复程序,使用这个声明
declarevar模块tsc --out validationmodule.js Validation.ts ZipCodeValidator.ts LettersOnlyValidator.ts ValidationExport.ts
var Validation = require("./validationmodule");

var zipCodeValidator = new Validation.ZipCodeValidator();
var lettersOnylValidator = new Validation.LettersOnlyValidator();

console.log(zipCodeValidator.isAcceptable("16211"));
console.log(lettersOnylValidator.isAcceptable("5555"));