TypeScript: import module with only statements



我有一个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的内容。

我的问题是,为什么会发生这种情况?如何强制typescript导入代码中没有显式使用的模块?

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

在你的TypeScript文件的顶部包含一个adm -dependency元素。

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

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

前者可能是产生副作用的可能性最小的一种。不幸的是,元素和它的用法没有很好的文档。

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

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

生成的js不会导入代码中未显式使用的模块。Typescript在这方面很聪明,它不会为一个只导入而不使用的模块生成任何js。

你需要:

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

那么把page-a.js设置成这样:

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

和主要。

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');

我知道我迟到了,但这里有另一种方法:
你可以告诉typescript只为了副作用而导入一个模块:
import "path/to/external/module";
虽然这是es6的语法,typescript会把它转换成AMD require(),当你把——module AMD传递给tsc,因为它只是为了副作用而导入的,所以它不会被删除。

最新更新