用于导入commonjs / amd模块的新的es6语法,例如`import foo = require('foo')`
以前我可以这样做:
import foo = require('foo');
但是现在TypeScript(1.5)支持es6模块语法,在ES6模块语法中实现相同的正确方法是什么?
正确的方法是继续使用旧的导入语法。 新的导入语法仅适用于ES模块,旧的导入语法适用于ES6之前的模块。 这两者是有区别的,故意如此。 import * as foo from 'foo'
模块'foo'的所有属性 ,它不会将默认值导入为foo
。
从function的devise者 :
- 导出默认声明总是声明一个名为default的导出成员,并始终作为对exports.default的分配发出。 换句话说,
export default
一致地具有ES模块语义。 为了与Babel兼容,我们可以select在模块有默认导出的时候发出__esModule
标记,但是我们实际上不会使用这个标记__esModule
任何事情。 - 一个
export =
声明,代替了一个不同的实体被导出来代替模块本身,总是作为一个赋值给module.exports
。 其他输出在使用export =
的模块中是错误的。 这是现有的TypeScript行为。 - 使用
export =
来导出另一个模块(即内部或外部模块)的模块可以使用新的ES6结构导入。 特别是方便的解构导入可以与这样的模块一起使用。 使用export =
来导出另一个模块的模式在.d.ts文件中很常见,这些文件提供了内部模块的CommonJS / AMD视图(例如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黑客。 将来的TypeScript重新alignment到ES规范也可能导致它们中断。
因此,您应该更愿意继续使用上述的传统导入语法加载旧版模块,以避免让自己和处理代码的其他开发人员混淆ES6名称空间导入的工作原理,并避免混淆重大更改。
ES6模块语法的相应语法是:
import * as foo from 'foo';
基本上通过foo
的名称将所有从foo
模块导入到局部variables中。
ES6模块是有效的TypeScript外部模块,具有新的语法:ES6模块是单独加载的源文件,可能导入其他模块并提供许多可从外部访问的导出。 ES6模块具有几个新的导出和导入声明。 build议将TypeScript库和应用程序更新为使用新的语法,但这不是必需的。
资源
据我所知,这意味着你鼓励你将自己的TypeScript模块迁移到新的语法,但是继续使用import foo = require('foo')
来导入实际的AMD / CommonJS模块。
- Angular 2 2.0.0-rc.1属性'map'在types'Observable <Response>'上不存在与问题报告不一样
- 使用Typescript检查接口types
- TypeScript静态类
- 如何使用SystemJS和Gulp来准备发布版本?
- Angular 2 HTTP GET与TypeScript错误http.get(…).map不是中的函数
- 如何使用angular-cli webpackdebuggingangular2应用程序?
- 在Typescript中的数组<Type> VS Type
- 将Material Design Lite与Angular2集成
- 如何在TypeScript中获得jQuery自动完成?