TypeScript 1.8在AMD风格模块中的相对模块名解析与RequireJS 2.1



我正在尝试在遗留JS系统的一部分中使用TypeScript。在这个系统中,许多应用程序在RequireJS环境中执行,当应用程序启动时,main.js将执行。我创建了这个结构

App1/
   main.js
   app.ts
   Modules/
      myModule.ts
      Models/
         model1.js
         model2.js

模型是生成的代码,必须保留为. js文件。在不同的.ts模块中,应该通过Require语句来要求模型。

我知道如何在模块文件夹中的声明文件中使用这样的东西来让.ts文件编译。

   declare module "Models/model1" { var x:any; export = x;}  

但是代码不会执行,因为这会为myModule.ts创建一个AMD模块定义

define(["require","exports","Models/model1", function(require,exports,model){ ...

但是路径被Require.JS解析为

 http://mysite/Models/model1.js

缺少路径部分,因为path是相对的,必须是RequireJS上下文根的绝对值。我不能有模型作为TS,因为它们是生成的文件。它们不会仅仅通过重命名为.ts来编译此外,由于应用程序在控制、生产和单元测试设置中的运行方式不同,非相对路径也不可用。

问题:是否有办法让TypeScript为JavaScript (.js)模块生成相对路径?

你看过三斜杠指令吗?从TypeScript 2.0开始,import "moduleName"已经弃用了这个功能,但应该可以在旧版本中使用:

/// <amd-dependency path="x" />通知编译器有关非ts的信息需要在结果模块中注入的模块依赖项需要调用。

adm -dependency指令也可以有一个可选的name属性;这允许为adm依赖项传递一个可选的名称:

/// <amd-dependency path="legacy/moduleA" name="moduleA"/>
declare var moduleA:MyType
moduleA.callStuff()
生成的JS代码:
define(["require", "exports", "legacy/moduleA"], function (require, exports, moduleA) {
    moduleA.callStuff()
});

最新更新