【问题标题】:TypeScript: import module with only statementsTypeScript:仅包​​含语句的导入模块
【发布时间】:2013-05-03 12:59:44
【问题描述】:

我有一个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 导入代码未明确使用的模块?

【问题讨论】:

标签: requirejs typescript amd


【解决方案1】:

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

你需要:

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

所以有 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');

【讨论】:

  • 谢谢,你的把戏奏效了。在接受答案之前,我会等待一段时间看看是否有更好的解决方案。
  • 这不是骗人的 :) requirejs“要求”模块包含在 define([],()=>{}) 块中。
  • TypeSript 仅在文件中有要导出的东西时才会生成它。
  • @user1749204 我知道。但这并不能满足我的需求。如果我可以“强制”导入一个模块..
  • 我知道 AMD 和模块存在很多问题......我上周末花了大约 28 小时来处理这些问题。有许多问题和许多解决方案。环境声明、requirejs 插件、声明文件。所以请详细说明你想在不同的问题中实现什么。
【解决方案2】:

除了@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),但我非常不同意。如果我已经导入了一个模块/文件并且我引用了该模块中的具体类型,那么必须在该点加载该模块才能运行。不得不做额外的步骤是多余的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2021-09-01
      • 2020-07-14
      • 2021-08-28
      • 2018-02-06
      • 2021-11-27
      • 2021-10-28
      相关资源
      最近更新 更多