module关键字在typescript中意味着什么?

ipi*_*nak 9 angularjs typescript systemjs

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

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

// file1.ts
module NSpace.Space {
   export class MyClass {
      constructor() { ... }
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,我尝试使用和重新导出访问另一个文件

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

export {MyClass}
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

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

从我到目前为止阅读和经历的情况来看,似乎ES6模块是基于文件结构定义的,这就是我得到这个错误的原因.

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

Fen*_*ton 10

moduleTypeScript中的关键字引起了一些混乱,因此它将被重命名namespace.

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

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

// file1.ts
export class MyClass {
   constructor() { ... }
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后这将工作:

import {MyClass} from 'file1';
Run Code Online (Sandbox Code Playgroud)

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

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