TypeScript:仅包​​含语句的导入模块

dee*_*hao 6 amd requirejs typescript

我有一个page-a.ts会编译成page-a.js:

alert('this is from page-a');
Run Code Online (Sandbox Code Playgroud)

我有一个main.ts编译成main.js:

import pageA = module('page-a')
alert('this is from main');
Run Code Online (Sandbox Code Playgroud)

这是我的tsc命令行:

tsc --module amd page-a.ts main.ts
Run Code Online (Sandbox Code Playgroud)

我正在使用requirejs这样的:

<script src="require.js" data-main="main.js"></script>
Run Code Online (Sandbox Code Playgroud)

page-a加载页面时,我看不到警报消息框.在生成的脚本中main.js,没有任何内容page-a.

我的问题是,为什么会发生这种情况?如何强制打字稿导入代码未明确使用的模块?

Ric*_*tte 11

除了@basarat提到的方法之外,还有另外两种方法可以确保导入的模块包含在define函数中并因此加载.

在ams-dependency元素的顶部包含amd-dependency元素.

///<amd-dependency path="pathToFileRelativeToBaseWithoutFileExtension"/>
Run Code Online (Sandbox Code Playgroud)

要么

import moduleName = require("pathToFileRelativeToBaseWithoutFileExtension");
moduleName;  //Does not require declaring a new variable.
Run Code Online (Sandbox Code Playgroud)

前者可能是副作用最小的人.不幸的是,元素及其用法没有很好地记录.

我在使用延迟加载AngularJS模块时发现这些方法是必需的,这些模块创建并注册要依赖注入的类型.由于就TS编译器而言永远不会创建或分配类型,因此它不会为define函数创建必要的参数.

他们说这是设计(https://typescript.codeplex.com/workitem/2436),但我恭敬地不同意.如果我已导入模块/文件并且我在该模块中引用了具体类型,则必须在该点加载该模块才能运行.必须做额外的步骤是多余的.


bas*_*rat 4

您生成的 js 不会导入代码中未明确使用的模块。Typescript 的这种方式很聪明,不会为只导入而不使用的模块生成任何 js。

你需要 :

  • 导出第一个模块中的变量并且
  • 在第二个模块中导入第一个模块并且
  • 在第二个模块中使用导出的变量

所以 page-a.js 是这样的:

export var x = 123; // just to export something that you can use
alert('this is from page-a');
Run Code Online (Sandbox Code Playgroud)

和 main.ts 为:

import pageA = module('page-a')
var foo = pageA.x; // If you remove this line and you will not get the alert from page-a
alert('this is from main');
Run Code Online (Sandbox Code Playgroud)