小编典典

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

javascript

以前我可以做:

import foo = require('foo');

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


阅读 787

收藏
2020-05-01

共1个答案

小编典典

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

来自功能的设计者:

  • 导出默认声明始终声明一个名为default的导出成员,并始终作为对exports.default的赋值发出。换句话说,export default始终具有ES模块的语义。为了与Babel兼容,我们可以选择__esModule在模块具有默认导出功能时发出标记,但是实际上我们不会将该标记用作任何对象。
  • export =始终将声明替换为要导出的其他实体代替模块本身的声明module.exports。在使用的模块中包含其他导出是错误的export =。这是现有的TypeScript行为。
  • 使用一个模块export =导出另一模块(是内部或外部模块)可以使用新ES6构建体被导入。特别是,方便的解构导入可以与此类模块一起使用。export =用于导出另一个模块的模式在.d.ts文件中很常见,该文件提供了内部模块的CommonJS / AMD视图(例如angular.d.ts)。
  • 模块使用export =到位本身必须使用现有的导入模块的非实体模块输出import x = require("foo")的语法是今天的情况。

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

当您以这种方式导入的旧版模块更新为ES6模块时,这些模块的“默认”导入将停止工作(因为* as foo导入 应该 是在导入名称空间对象),如果您不知道这样做,可能会造成极大的混乱这是一个TypeScript / SystemJS
hack。将来TypeScript对ES规范的重新调整也有可能导致它们中断。

因此,您可能更希望继续使用上述的旧版导入语法来加载旧版模块,以避免使您自己和其他开发人员就您的代码对ES6名称空间导入的工作方式感到困惑,并避免使变更令人困惑。

2020-05-01