TypeScript中内部和外部模块之间的区别是什么?

Val*_*tin 42 typescript

我花了一些时间阅读Typescript语言规范,并对内部外部模块之间的区别感到有些困惑.以下是直接从规范中进行的描述:

内部模块(第9.2.2节)是其他模块的本地或导出成员(包括全局模块和外部模块).使用指定其名称和正文的ModuleDeclarations声明内部模块.具有多个标识符的名称路径等同于一系列嵌套的内部模块声明.

外部模块(第9.4节)是使用外部模块名称引用的单独加载的代码体.外部模块被编写为包含至少一个导入或导出声明的单独源文件.此外,可以使用全局模块中的AmbientModuleDeclarations声明外部模块,该模块直接将外部模块名称指定为字符串文字.这将在第0节中进一步描述.

根据我的理解,我认为外部模块对应于打字稿文件,而不包含简单地导出一组类型和/或变量的模块定义.从另一个打字稿文件,我可以简单的导入在外部模块foo.tsimport foo = module("foo");

有人可以向我解释外部和内部模块之间的意图吗?

Pet*_*son 26

规范的第9.3和9.4节更清楚地解释了这一点.我将在这里重现这些部分给出的一些例子.

外部模块

假设以下代码在main.ts.

import log = module("log");
log.message("hello");
Run Code Online (Sandbox Code Playgroud)

此文件引用外部模块log,由任何log.ts导出定义.

export function message(s: string) { 
  console.log(s); 
}
Run Code Online (Sandbox Code Playgroud)

请注意,log.ts不在module任何地方使用关键字.它只是出口东西export.

内部模块

该文件有两个内部模块X.Y.Z.

module A.B.C { 
  import XYZ = X.Y.Z; 
  export function ping(x: number) { 
    if (x > 0) XYZ.pong(x – 1); 
  }
} 
module X.Y.Z { 
  import ABC = A.B.C; 
  export function pong(x: number) { 
    if (x > 0) ABC.ping(x – 1); 
  } 
}
Run Code Online (Sandbox Code Playgroud)

这些(主要)表现为外部模块,但它们包含在一个文件中,您不必引用任何外部文件来使用它们.它们必须module在定义时包含在块内.

  • 看起来外部模块是隐式模块,而内部模块是显式模块吗? (3认同)
  • 如果明确表示"需要`module`关键字",是的. (2认同)

End*_*imo 7

根据Anders的演示文稿:http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript(34:40)和Typescript文档,外部模块是基于顶级AMD(异步模型定义)或CommonJS的.

外部模块在隐藏模块定义的内部语句并且仅显示与声明的变量关联的方法和参数的意义上是有用的.

假设您有一个Main已定义log方法的类放在transfer.js文件中.在内部的方法Main时,要导入的类才可见transfer.js在源js文件的顶部文件,像这样:///<reference path="transfer.js"/>.这样编译器就可以在运行时消除所有js文件的遍历.

这是使用外部模块的巨大好处.另一个是当您尝试引用外部方法或类时,该方法或类在方法调用之后定义正常的自顶向下javascript流.使用外部模块,引用的类仅在方法调用时实例化.