7

我有一个page-a.ts可以编译成page-a.js

alert('this is from page-a');

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

import pageA = module('page-a')
alert('this is from main');

这是我的tsc命令行:

tsc --module amd page-a.ts main.ts

我正在使用requirejs这样的:

<script src="require.js" data-main="main.js"></script>

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

我的问题是,为什么会这样?以及如何强制打字稿导入代码未明确使用的模块?

4

3 回答 3

11

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

在 TypeScript 文件的顶部包含 amd-dependency 元素。

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

或者

import moduleName = require("pathToFileRelativeToBaseWithoutFileExtension");
moduleName;  //Does not require declaring a new variable.

前者可能是产生副作用的可能性最小的一种。不幸的是,该元素及其用法没有得到很好的记录。

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

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

于 2014-04-15T11:45:12.010 回答
4

您生成的 js 不会导入代码中未明确使用的模块。Typescript 很聪明,不会为仅导入且未使用的模块生成任何 js。

你需要 :

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

所以有 page-a.js 类似的东西:

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

和 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');
于 2013-05-09T06:44:20.500 回答
2

我知道我迟到了,但这是实现此目的的另一种方法:
您可以使用以下命令告诉 typescript 导入模块只是为了产生副作用:
import "path/to/external/module";
虽然这是 es6 语法 typescript 会在您通过时将其转换为 AMD require() --模块 amd 到 tsc 并且因为它只是为了副作用而被导入它不会被丢弃。

于 2016-11-29T16:24:14.083 回答