2014-03-29 138 views
7

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

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

我无法弄清楚如何编写我的TypeScript代码,以便加载一个没有对应的TypeScript的JavaScript AMD模块,并且看来最新版本的TypeScript还不支持这一点。

如果我开始与来自0.9.7打字稿说明书的例子中,部分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模块的“日志”引用。 以下是运行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方法中做到这一点,那么我可以继续我的项目的完整模块化。

回答

2

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

如果唯一可用的log.js您可以使用declare即创建一个log.d.tslog告诉类型的信息打字稿:

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

,然后用它从main.ts为:

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

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

这就像你写的一样。但是如果我保留原始示例中的名称“./log”,那么它将无法编译。我搜索了语言规范并找到了第12.1.6节“环境外部模块声明”,它描述了模块名称是顶级(非相对)名称的限制。但是,我无法找到解释为什么这是如此。我只能猜测这样的命名没有真正的需要? 你有解释这个限制吗?谢谢 – psnider

+0

Js文件应该来自npm或来自您的RequireJS配置。这两种情况下的名称都不是相对的 – basarat

+0

我发现使用字符串作为AMD模块名称的要求令人困惑,但发现这篇文章描述了用法:https://typescript.codeplex.com/wikipage?title=Modules 20英寸%%20TypeScript – psnider