如何将javascript AMD模块导入外部TypeScript模块?

时间:2014-03-29 21:49:00

标签: javascript module typescript external amd

如何将javascript AMD模块导入外部TypeScript模块?

我正在将我的客户端TypeScript程序模块化,以使用由bower管理的AMD模块。 作为此过程的一部分,Typescript模块成为一个javascript AMD模块,然后我发布。 现在我有一个我希望包含在TypeScript模块中的javascript AMD模块,我不想用javascript AMD发布原始的TypeScript。

我无法弄清楚如何编写我的TypeScript代码,以便加载一个没有相应TypeScript的javascript AMD模块,而且最近版本的TypeScript似乎还不支持这个。

如果我从0.9.7 TypeScript规范的例子开始,第11.2节:

文件main.ts:

import log = require("./log"); 
log.message("hello"); 

文件log.ts:

export function message(s: string) { 
    console.log(s); 
}

我相信我应该能够修改main.ts,以便编译器解析对log.js AMD模块的“log”引用。 下面是运行 tsc --module amd main.ts 生成的log.js文件。这是一个正确的AMD模块。

文件log.js:

define(["require", "exports"], function(require, exports) {
    function message(s) {
        console.log(s);
    }
    exports.message = message;
});

要模拟拥有一个javascript AMD模块,请编译上面的示例,然后删除log.ts文件。 如果您现在尝试使用相同的命令进行编译,则会因以下错误而失败:

./main.ts(1,1): error TS2071: Unable to resolve external module '"./log"'.  
./main.ts(1,1): error TS2072: Module cannot be aliased to a non-module type.

我现在如何修改main.ts以便编译并解析这个log.js AMD模块? 如果必须的话,我可以编写log.d.ts文件,但是想要一个没有声明文件的方法。

如果我可以在规范的TypeScript方式中学习如何做到这一点,那么我可以继续完成我项目的模块化。

1 个答案:

答案 0 :(得分:2)

  

我现在如何修改main.ts以便加载和使用这个log.js AMD模块?

如果您只有log.js可用,您可以使用log告诉打字稿来自declare的类型信息,即创建log.d.ts

declare module 'log'{
    export function message(s:string);
}

然后从main.ts使用它:

/// <reference path='log.d.ts'/>    

import log = require('log'); 
log.message("hello");