关于TypeScript模块导入的那些事
前言
模块在其自身的作用域里执行,而不是在全局作用域里;这意味着定义在一个模块里的变量,函数,类等等在模块外部是不可见的,除非你明确地使用export之一导出它们。相反,如果想使用其它模块导出的变量,函数,类,接口等的时候,你必须要导入它们,可以使用import之一。
模块是自声明的。在TypeScript里,两个模块之间的关系是通过在文件级别上使用import和export建立的。
下面话不多说了,来一起看看详细的介绍吧
ES6模块导入的限制
我们先来看一个具体的例子:
在Node项目里,使用CommonJS规范引入一个模块:
constkoa=require('koa')
改写为TypeScript(1.5+版本)时,通常有两种方式:
使用ES6模块导入方式:
//allowSyntheticDefaultImports:false import*askoafrom'koa'
使用TypeScript模块导入语法:
importkoa=require('koa')
两者大部分是等价的,但ES6规范对import*as创建出的模块对象有一点限制。
根据该规范,该模块对象不可被调用,也不可被实例化,它只具有属性。
因此,如果你想调用该对象,或者使用new方法,在allowSyntheticDefaultImports:false的配置下,应该使用例子中的第二种方式。
2.7版本对CommonJs/AMD/UMD模块导入的增强
在之前的版本,TypeScript对CommonJs/AMD/UMD模块的处理方式与ES6模块相同,这会导致一些问题:
- 如前文所提到的,当导入一个CommonJs/AMD/UMD模块时,TypeScript视import*askoafrom'koa'与constkoa=require('koa')等价,但使用import*as创建的模块对象实际上不可被调用以及被实例化。
- 类似的,当导入一个CommonJs/AMD/UMD模块时,TypeScript视importfoofrom'foo'与constkoa=require('koa').default等价,但在大部分CommonJs/AMD/UMD模块里,它们并没有默认导出。
在2.7的版本里,TypeScript提供了一个新选项--esModuleInterop,旨在解决上述问题,
当使用该选项,且模块为CommonJs/AMD/UMD时,它会导入一个可调用或是可实例化的模块,同时它规定该模块必须作为默认导入:
importkoafrom'koa' constapp=newkoa()
模块导入仅仅是一些声明类型
在以非相对路径导入一个模块时,你可能会看到Couldnotfindadeclarationfileformodule'someModule'的错误,此时你可以安装对应模块的声明文件或者写一个包含declaremodule'someModule'的声明文件。
实际上,当我们导入一个模块时:
importkoafrom'koa' //importkoa=require('koa')
它所做的事情只有两个:
- 导入模块的所有类型信息;
- 确定运行时的依赖关系。
当你加载此模块,但并没有使用,或仅当作类型来使用时,编译后,此模块将会被移除。
当不使用时;
importkoafrom'koa'
编译后:
仅当做类型使用时:
importkoafrom'koa' letk:koa
编译后:
vark
做为值使用时,编译后,此模块将会被保留:
importkoafrom'koa' constapp=newkoa()
编译后(假设使用commonjs):
var__importDefault=(this&&this.__importDefault)||function(mod){ return(mod&&mod.__esModule)?mod:{"default":mod}; }; varkoa_1=__importDefault(require("koa")); vark=newkoa_1.default();
注:__importDefault为使用--esModuleInterop选项时产生的方法。
参考
http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html
https://stackoverflow.com/questions/35706164/typescript-import-as-vs-import-require?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
https://basarat.gitbooks.io/typescript/content/docs/project/external-modules.html
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。