使用Javascript / RequireJS,打字稿AMD实现不好

时间:2013-04-25 11:21:46

标签: requirejs typescript

如果我有这个ts模块:

export function say(){
    console.log("said");
}

我使用amd选项编译它,我可以很容易地从ts客户端使用它:

import foo = module("tsmodule")
foo.say();

export var x = 123;

但是,如果我有相当于ts模块的javascript:

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

无法轻易使用它。最简单的解决方案:

// of course you can use .d.ts for requirejs but that is beside the point
declare var require:any;

// will fail with error module has not been loaded yet for context
// http://requirejs.org/docs/errors.html#notloaded
var useme = require("jsmodule")
useme.say();

export var x = 123;
import foo = module("tsmodule")
foo.say();
由于错误http://requirejs.org/docs/errors.html#notloaded

失败。由于“jsmodule”未传递给生成的typescript中的define调用。

我有两个解决方法

  • 不使用导入/导出(语言功能丢失)
  • 使用require([])(仍然无法导出依赖于require([])调用的内容)

有限制:https://github.com/basarat/typescript-requirejs。还有另外一种方法吗?如果没有,你可以在这里投票:https://typescript.codeplex.com/workitem/948 :)

1 个答案:

答案 0 :(得分:3)

如果您想加载JavaScript模块,可以随时使用(记录严重的)amd-dependency标记:

/// <amd-dependency path="jsmodule" />

这会将jsmodule放入定义调用的依赖项数组中。

然后提供一个声明文件,您只需在其中声明

module useme {
    function say(): void;
}