如何将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方法中做到这一点,那么我可以继续我的项目的完整模块化。
这就像你写的一样。但是如果我保留原始示例中的名称“./log”,那么它将无法编译。我搜索了语言规范并找到了第12.1.6节“环境外部模块声明”,它描述了模块名称是顶级(非相对)名称的限制。但是,我无法找到解释为什么这是如此。我只能猜测这样的命名没有真正的需要? 你有解释这个限制吗?谢谢 – psnider
Js文件应该来自npm或来自您的RequireJS配置。这两种情况下的名称都不是相对的 – basarat
我发现使用字符串作为AMD模块名称的要求令人困惑,但发现这篇文章描述了用法:https://typescript.codeplex.com/wikipage?title=Modules 20英寸%%20TypeScript – psnider