模拟关键字在打字稿中意味着什么?

时间:2015-11-17 08:46:01

标签: angularjs typescript systemjs

我正在尝试解决与ES6模块相关的一些问题。如何将名称空间与angular和typescript一起使用。

假设以下代码表示角度指令。有谁知道module关键字的含义以及如何在其他文件中访问MyClass。

// file1.ts
module NSpace.Space {
   export class MyClass {
      constructor() { ... }
      ...
   }
}

我尝试使用和重新导出访问其他文件,但是

// file2.ts
import {MyClass} from 'file1';

export {MyClass}

我收到此错误: 错误TS2306:文件'file.ts'不是模块

我的问题是:

  • 为什么我会这样?
  • 这个module关键字是什么?
  • 我们是仅根据目录结构创建ES6模块还是可以 我们实际上使用这种表示法? module Space.Space1.Space2 ...

从我读过的内容到目前为止看来ES6模块似乎是基于文件结构定义的,这就是我收到此错误的原因。

我没有写过这段代码,这就是我要问的原因。另外,提一下我正在使用System.JS进行导入可能很有用。

1 个答案:

答案 0 :(得分:8)

TypeScript中的module关键字引起了一些混淆,因此它将重命名为namespace

但是,不是使用命名空间,而是可以按文件/文件系统组织代码(这意味着实际的文件位置将与感知的命名空间匹配。这就是“外部模块”(TypeScript)的工作方式 - 以及ECMAScript 2015的方式模块工作。

因此,通过快速调整,您将拥有:

// file1.ts
export class MyClass {
   constructor() { ... }
   ...
}

然后这将有效:

import {MyClass} from 'file1';

如果您编译目标ES6,您会注意到这行代码不需要翻译,它与模块导入的标准相匹配。如果您的目标是ES5或更低,TypeScript将为您转换此语句(您可以使用--module标志选择转换。

我倾向于使用UMD编译选项,这意味着输出可以在Web浏览器(使用RequireJS)或Node上运行。系统JS目前实际上获得了很大的吸引力,所以你可能也想考虑这一点。最终,浏览器将本身支持模块加载。