以前我可以这样做:
import foo = require('foo');
但是现在TypeScript(1.5)支持es6模块语法,在ES6模块语法中实现相同的正确方法是什么。
答案 0 :(得分:81)
正确的方法是继续使用旧的导入语法。新的导入语法仅适用于ES模块,旧的导入语法适用于ES6之前的模块。故意这两者是截然不同的。 import * as foo from 'foo'
导入模块的所有属性' foo',不会将默认值导入为foo
即可。
From the designer of the feature:
export default
始终具有ES模块语义。为了与Babel兼容,我们可以选择在模块具有默认导出时发出__esModule
标记,但我们实际上不会将该标记用于任何内容。export =
声明替代要导出的其他实体代替模块本身,始终作为module.exports
的赋值发出。在使用export =
的模块中进行其他导出是错误的。这是现有的TypeScript行为。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库和 应用程序将更新为使用新语法,但这不是一个 要求。
据我了解,这意味着我们鼓励您将自己的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");