繁体   English   中英

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

[英]New es6 syntax for importing commonjs / amd modules i.e. `import foo = require('foo')`

以前我可以这样做:

import foo = require('foo');

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

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

来自该功能的设计师

  • 导出默认声明始终声明一个名为 default 的导出成员,并且始终作为对exports.default 的赋值发出。 换句话说, export default始终具有 ES 模块语义。 为了与 Babel 兼容,当模块具有默认导出时,我们可以选择发出__esModule标记,但我们实际上不会将该标记用于任何事情。
  • 一个export =声明,它替换一个不同的实体来代替模块本身,总是作为对module.exports的赋值module.exports 在使用export =的模块中有其他导出是错误的。 这是现有的 TypeScript 行为。
  • 使用export =导出另一个模块(内部或外部模块)的模块可以使用新的 ES6 结构导入。 特别是,方便的解构导入可以与此类模块一起使用。 使用export =导出另一个模块的模式在 .d.ts 文件中很常见,这些文件提供内部模块的 CommonJS/AMD 视图(例如 angular.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 节“值“*”表示导入请求是针对目标模块的命名空间对象。” )。

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

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

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

import * as foo from 'foo';

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

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

import foo from 'foo';

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

来源

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

全部导入,

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");

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

const foo = require("foo");

TypeScript 和 Babel 都同意如何处理这个问题。 此外,如果您无论如何要编译到 ES5 或更少,那么这与最终形式不会相差太远。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM