之前我能做到:
import foo = require('foo');
但是现在TypeScript(1.5)支持ES6模块语法,那么在ES6模块语法中实现相同功能的正确方式是什么?
之前我能做到:
import foo = require('foo');
但是现在TypeScript(1.5)支持ES6模块语法,那么在ES6模块语法中实现相同功能的正确方式是什么?
正确的方法是继续使用旧的导入语法。新的导入语法仅适用于ES模块,而旧的导入语法适用于ES6之前的模块。这两者是不同的,有意为之。
import * as foo from 'foo'
导入模块 'foo' 的所有属性,它不会将默认值作为foo
导入。
export default
始终具有ES模块语义。为了与Babel兼容,我们可以选择在模块具有默认导出时发出__esModule
标记,但我们实际上不会使用该标记。export =
声明,用于替代其他实体以代替模块本身,始终作为对module.exports
的赋值发出。在使用export =
的模块中有其他导出是错误的。这是现有的TypeScript行为。export =
将另一个模块(无论是内部模块还是外部模块)导出到模块的模块可以使用新的ES6结构进行导入。特别地,方便的解构导入可以与这些模块一起使用。使用export =
导出另一个模块的模式在提供内部模块的CommonJS / AMD视图的.d.ts文件(例如angular.d.ts)中很常见。export =
以非模块实体代替模块本身导出的模块必须使用现有的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规范的调整也可能导致它们失效。
import x = require('foo')
。 - JKillianimport
语句实现的。如果你想要使用遗留模块,则不能将目标环境设置为 ES6,因为 TypeScript 编译器会在这种情况下直接输出原样的 import
语句,而 ES 规范并没有针对具有默认导出的 CJS/AMD 模块做任何规定。 - C Snoverimport * as <name> from <'module'>
语法仍然有效。 - echenES6 模块语法的相应语法为:
import * as foo from 'foo';
通过名称为foo
的本地变量从foo
模块中导入所有内容。
export {Output};
ж›үжҚұ旧文件еғ•йѓЁзљ„export = Output
ж—¶пәЊе‡ғзҺ°дғ†вЂњresolves to a non-module entity and cannot be imported using this constructвЂқзљ„й”™иҮҮгЂ‚иҮ·её®ж€‘дү®ж”№дёЂдё‹гЂ‚ - dcsan从TypeScript 2.7开始,有一个新的esModuleInterop
标志,可以用于启用与CommonJS / AMD / UMD的默认导入。通过在tsconfig.json
中将该标志设置为true
,此操作应按预期工作:
import foo from 'foo';
导入全部,
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或更低版本,那么这与最终形式也不会有太大差异。