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

时间:2015-04-13 01:39:39

标签: javascript typescript ecmascript-6

以前我可以这样做:

import foo = require('foo');

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

6 个答案:

答案 0 :(得分:81)

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

From the designer of the feature

  • 导出默认声明始终声明一个名为default的导出成员,并始终作为exports.default的赋值发出。换句话说,export default始终具有ES模块语义。为了与Babel兼容,我们可以选择在模块具有默认导出时发出__esModule标记,但我们实际上不会将该标记用于任何内容。
  • export =声明替代要导出的其他实体代替模块本身,始终作为module.exports的赋值发出。在使用export =的模块中进行其他导出是错误的。这是现有的TypeScript行为。
  • 可以使用新的ES6构造导入使用export =导出另一个模块(可以是内部或外部模块)的模块。特别是,方便的解构输入可以与这些模块一起使用。使用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“值" *"表示导入请求是针对目标模块的{{3 }}“。)。

当以这种方式导入的旧模块更新为ES6模块时,这些模块的“默认”导入将停止工作(因为假定 导入 >命名空间对象),如果您不知道这样做是TypeScript / SystemJS hack,这可能会非常混乱。 ES规范的未来TypeScript重新调整也可能导致它们中断。

因此,您可能更愿意继续使用上述旧版导入语法来加载旧版模块,以避免让自己和其他开发人员混淆您的代码,了解ES6命名空间导入的工作方式,并避免混淆不断变化。< / p>

答案 1 :(得分:9)

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

import * as foo from 'foo';

基本上将foo模块中的所有内容导入名为foo的本地变量。

答案 2 :(得分:3)

  

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

Source

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

答案 3 :(得分:1)

TypeScript 2.7开始,有一个新的esModuleInterop标志可用于启用CommonJS / AMD / UMD的默认导入。通过在true中将该标记设置为tsconfig.json,这应该按预期工作:

import foo from 'foo';

答案 4 :(得分:1)

另一种选择是使用commonjs语法导入它:

const foo = require("foo");

TypeScript和Bable都同意如何处理。另外,如果您还是要编译到ES5或更低版本,那么与最终版本的距离不会太远。

答案 5 :(得分:0)

要全部导入,

const foo = require("foo");

这将从包“ foo”中导入所有实例(如果有的话)

const foo = require("./foo");

因此您可以通过调用foo.InstanceName

来访问每个实例

如果要导入特定实例,

import MyInstance from "foo";

因此它将从“ foo”导入特定实例(Myinstance) 您仍然可以使用上述方法导入所有内容,

import * as ReferenceName from "foo";

等同于

const ReferenceName = require("foo");