首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于导入公共es6 / amd模块的新es6语法,即“导入foo =require(‘foo’)”

用于导入公共es6 / amd模块的新es6语法,即“导入foo =require(‘foo’)”
EN

Stack Overflow用户
提问于 2015-04-13 01:39:38
回答 6查看 73.5K关注 0票数 82

以前我可以这样做:

代码语言:javascript
复制
import foo = require('foo');

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-04-13 05:28:27

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

功能的设计人员。

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

2016更新:在某些情况下,( TypeScript编译器)开始允许import * as foo from 'legacy-module-foo'获得遗留模块的默认导入。--这违反了ES6规范 (第15.2.1.16节,值"*“表示导入请求是针对目标模块的http://www.ecma-international.org/ecma-262/6.0/index.html#sec-module-namespace-objects的)。

当以这种方式导入的遗留模块被更新为ES6模块时,这些模块的“默认”导入将停止工作(因为* as foo导入应该是导入命名空间对象),如果您不知道这样做是一种类型记录/SystemJS攻击,这可能会非常混乱。也有可能未来的TypeScript调整到ES规范会导致它们中断。

因此,您可能更倾向于继续使用上面描述的遗留导入语法来加载遗留模块,以避免让您自己和其他开发人员对ES6名称空间导入的工作方式感到困惑,并避免混淆最新的更改。

票数 105
EN

Stack Overflow用户

发布于 2015-04-13 01:39:38

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

代码语言:javascript
复制
import * as foo from 'foo';

基本上,将所有内容从foo模块导入到一个名为foo的局部变量中。

票数 17
EN

Stack Overflow用户

发布于 2018-03-13 15:26:25

TypeScript 2.7中,有一个新的esModuleInterop标志,它可以使用CommonJS/AMD/UMD启用默认导入。通过在您的true中将该标志设置为tsconfig.json,这将如预期的那样工作:

代码语言:javascript
复制
import foo from 'foo';
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29596714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档