用于导入commonjs / amd模块的新的es6语法,例如`import foo = require('foo')`

以前我可以这样做:

import foo = require('foo'); 

但是现在TypeScript(1.5)支持es6模块语法,在ES6模块语法中实现相同的正确方法是什么?

正确的方法是继续使用旧的导入语法。 新的导入语法仅适用于ES模块,旧的导入语法适用于ES6之前的模块。 这两者是有区别的,故意如此。 import * as foo from 'foo'模块'foo'的所有属性 ,它不会将默认值导入为foo

从function的devise者 :

  • 导出默认声明总是声明一个名为default的导出成员,并始终作为对exports.default的分配发出。 换句话说, export default一致地具有ES模块语义。 为了与Babel兼容,我们可以select在模块有默认导出的时候发出__esModule标记,但是我们实际上不会使用这个标记__esModule任何事情。
  • 一个export =声明,代替了一个不同的实体被导出来代替模块本身,总是作为一个赋值给module.exports 。 其他输出在使用export =的模块中是错误的。 这是现有的TypeScript行为。
  • 使用export =来导出另一个模块(即内部或外部模块)的模块可以使用新的ES6结构导入。 特别是方便的解构导入可以与这样的模块一起使用。 使用export =来导出另一个模块的模式在.d.ts文件中很常见,这些文件提供了内部模块的CommonJS / AMD视图(例如angular.d.ts)。
  • 使用export =来导出非模块实体来代替模块本身的模块必须使用现有的import x = require("foo")语法来导入,就像当前的情况一样。

2016更新:在某些情况下,TypeScript编译器开始允许import * as foo from 'legacy-module-foo'以在某些情况下获取传统模块的默认导入。 这违反了ES6规范 ( §15.2.1.16 , “值”*“表示导入请求是针对目标模块的命名空间对象的 )。

当以这种方式导入的遗留模块更新为ES6模块时,这些模块的“默认”导入将停止工作(因为* as foo导入应该是导入名称空间对象 ),如果您不这样做知道这样做是一个TypeScript / SystemJS黑客。 将来的TypeScript重新alignment到ES规范也可能导致它们中断。

因此,您应该更愿意继续使用上述的传统导入语法加载旧版模块,以避免让自己和处理代码的其他开发人员混淆ES6名称空间导入的工作原理,并避免混淆重大更改。

ES6模块语法的相应语法是:

 import * as foo from 'foo'; 

基本上通过foo的名称将所有从foo模块导入到局部variables中。

ES6模块是有效的TypeScript外部模块,具有新的语法:ES6模块是单独加载的源文件,可能导入其他模块并提供许多可从外部访问的导出。 ES6模块具有几个新的导出和导入声明。 build议将TypeScript库和应用程序更新为使用新的语法,但这不是必需的。

资源

据我所知,这意味着你鼓励你将自己的TypeScript模块迁移到新的语法,但是继续使用import foo = require('foo')来导入实际的AMD / CommonJS模块。