以前我可以这样做:
import foo = require('foo');
但是现在 TypeScript (1.5) 支持 es6 module语法,在 ES6 module语法中实现相同的正确方法是什么。
以前我可以这样做:
import foo = require('foo');
但是现在 TypeScript (1.5) 支持 es6 module语法,在 ES6 module语法中实现相同的正确方法是什么。
正确的方法是继续使用旧的导入语法。新的导入语法仅适用于 ES module,旧的导入语法适用于 ES6 之前的module。两者是不同的,故意如此。import * as foo from 'foo'
导入module 'foo' 的所有属性,它不会将默认值导入为foo
.
export default
始终具有 ES module语义。为了与 Babel 兼容,__esModule
当module具有默认导出时,我们可以选择发出一个标记,但我们实际上不会将该标记用于任何事情。export =
声明,它替换一个不同的实体来代替module本身,总是作为对 的赋值发出module.exports
。在使用export =
. 这是现有的 TypeScript 行为。export =
导出另一module(是内部或外部module)可以使用新ES6构建体被导入。特别是,方便的解构导入可以与此类module一起使用。export =
用于导出另一个module的模式在 .d.ts 文件中很常见,这些文件提供内部module的 CommonJS/AMD 视图(例如 angular.d.ts)。export =
到位本身必须使用现有的导入module的非实体module输出import x = require("foo")
的语法是今天的情况。2016 年更新: TypeScript 编译器在某些时候开始允许import * as foo from 'legacy-module-foo'
在某些情况下获取旧module的默认导入。这违反了 ES6 规范(第15.2.1.16 节,“值“*”表示导入请求是针对目标module的命名空间对象。”)。
当您以这种方式导入的遗留module更新为 ES6 module时,这些module的“默认”导入将停止工作(因为* as foo
导入应该是导入命名空间对象),如果您不知道这样做,这可能会非常混乱这是一个 TypeScript/SystemJS hack。未来 TypeScript 对 ES 规范的重新调整也有可能导致它们崩溃。
因此,您可能更愿意继续使用上述的遗留导入语法来加载遗留module,以避免让您自己和其他开发人员对 ES6 命名空间导入的工作方式感到困惑,并避免混淆破坏性更改。
ES6 module语法对应的语法是:
import * as foo from 'foo';
基本上将foo
module中的所有内容导入到名为foo
.
从TypeScript 2.7 开始,有一个新esModuleInterop
标志可用于启用 CommonJS/AMD/UMD 的默认导入。通过true
在您的 中将该标志设置为tsconfig.json
,这应该可以按预期工作:
import foo from 'foo';
ES6 module实际上是具有新语法的 TypeScript 外部module:ES6 module是单独加载的源文件,可能会导入其他module并提供许多外部可访问的导出。ES6 module具有几个新的导出和导入声明。建议更新 TypeScript 库和应用程序以使用新语法,但这不是必需的。
据我了解,这意味着鼓励您将自己的 TypeScript module迁移到新语法,但继续import foo = require('foo')
用于导入实际的 AMD/CommonJS module。
导入所有,
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");