具有RequireJS 2.1的AMD样式模块中的TypeScript 1.8相对模块名称解析

时间:2016-11-08 04:38:11

标签: javascript typescript requirejs amd typescript-typings

我试图在旧版JS系统的一部分中使用TypeScript。 在此系统中,存在许多在RequireJS环境中执行的应用程序,其中main.js将在启动该应用程序时执行。我创建了这个结构

3.78

模型是生成的代码,必须保留为.JS文件。 不同的.ts模块的'Require'语句应该要求模型。

我知道如何在modules文件夹的Declaration文件中使用这样的东西来编译.ts文件。

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

但代码不会执行,因为这会为myModule.ts

创建一个这样的AMD模块定义
   declare module "Models/model1" { var x:any; export = x;}  

但路径由Require.JS解析为

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

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

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

1 个答案:

答案 0 :(得分:2)

你有没有看过Triple-Slash Directives?从TypeScript 2.0开始,import "moduleName"已弃用此版本,但适用于旧版本:

  

/// <amd-dependency path="x" />通知编译器非TS   需要在结果模块中注入的模块依赖项   需要打电话。

     

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

/// <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()
});