关于TypeScript模块导入的那些事


Posted in Javascript onJune 12, 2018

前言

模块在其自身的作用域里执行,而不是在全局作用域里;这意味着定义在一个模块里的变量,函数,类等等在模块外部是不可见的,除非你明确地使用export之一导出它们。 相反,如果想使用其它模块导出的变量,函数,类,接口等的时候,你必须要导入它们,可以使用import之一。

模块是自声明的。在TypeScript里,两个模块之间的关系是通过在文件级别上使用import和export建立的。

下面话不多说了,来一起看看详细的介绍吧

ES6 模块导入的限制

我们先来看一个具体的例子:

在 Node 项目里,使用 CommonJS 规范引入一个模块:

const koa = require('koa')

改写为 TypeScript(1.5+ 版本)时,通常有两种方式:

使用 ES6 模块导入方式:

// allowSyntheticDefaultImports: false
import * as koa from 'koa'

使用 TypeScript 模块导入语法:

import koa = require('koa')

两者大部分是等价的,但 ES6 规范对 import * as 创建出的模块对象有一点限制。

根据该规范,该模块对象不可被调用,也不可被实例化,它只具有属性。

因此,如果你想调用该对象,或者使用 new 方法,在 allowSyntheticDefaultImports: false 的配置下,应该使用例子中的第二种方式。

2.7 版本对 CommonJs/AMD/UMD 模块导入的增强

在之前的版本,TypeScript 对 CommonJs/AMD/UMD 模块的处理方式与 ES6 模块相同,这会导致一些问题:

  • 如前文所提到的,当导入一个 CommonJs/AMD/UMD 模块时,TypeScript 视 import * as koa from 'koa' 与 const koa = require('koa') 等价,但使用 import * as 创建的模块对象实际上不可被调用以及被实例化。
  • 类似的,当导入一个 CommonJs/AMD/UMD 模块时,TypeScript 视 import foo from 'foo' 与 const koa = require('koa').default 等价,但在大部分 CommonJs/AMD/UMD 模块里,它们并没有默认导出。

在 2.7 的版本里,TypeScript 提供了一个新选项 --esModuleInterop,旨在解决上述问题,
当使用该选项,且模块为 CommonJs/AMD/UMD 时,它会导入一个可调用或是可实例化的模块,同时它规定该模块必须作为默认导入:

import koa from 'koa'
const app = new koa()

模块导入仅仅是一些声明类型

在以非相对路径导入一个模块时,你可能会看到 Could not find a declaration file for module 'someModule' 的错误, 此时你可以安装对应模块的声明文件或者写一个包含 declare module 'someModule' 的声明文件。
实际上,当我们导入一个模块时:

import koa from 'koa'
// import koa = require('koa')

它所做的事情只有两个:

  • 导入模块的所有类型信息;
  • 确定运行时的依赖关系。

当你加载此模块,但并没有使用,或仅当作类型来使用时,编译后,此模块将会被移除。

当不使用时;

import koa from 'koa'

编译后:

仅当做类型使用时:

import koa from 'koa'
let k: koa

编译后:

var k

做为值使用时,编译后,此模块将会被保留:

import koa from 'koa'
const app = new koa()

编译后(假设使用 commonjs):

var __importDefault = (this && this.__importDefault) || function (mod) {
 return (mod && mod.__esModule) ? mod : { "default": mod };
};
var koa_1 = __importDefault(require("koa"));
var k = new koa_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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
Mar 08 Javascript
JS获取各种浏览器窗口大小的方法
Jan 14 Javascript
浅谈javascript 迭代方法
Jan 21 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
Jun 15 Javascript
关于Javascript中defer和async的区别总结
Sep 20 Javascript
js实现对table的增加行和删除行的操作方法
Oct 13 Javascript
JS获得多个同name 的input输入框的值的实现方法
Jan 09 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
Jun 30 Javascript
Angular angular-file-upload文件上传的示例代码
Aug 23 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
Sep 20 Javascript
在vue中根据光标的显示与消失实现下拉列表
Sep 29 Javascript
Vue 组件注册全解析
Dec 17 Vue.js
JS实现前端页面的搜索功能
Jun 12 #Javascript
微信小程序实现弹出菜单功能
Jun 12 #Javascript
微信小程序实现折叠与展开文章功能
Jun 12 #Javascript
微信小程序收藏功能的实现代码
Jun 12 #Javascript
记一次webpack3升级webpack4的踩坑经历
Jun 12 #Javascript
webpack4之SplitChunksPlugin使用指南
Jun 12 #Javascript
详解webpack4升级指南以及从webpack3.x迁移
Jun 12 #Javascript
You might like
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
python开发之字符串string操作方法实例详解
2015/11/12 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
python字符串查找函数的用法详解
2019/07/08 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
德国网上宠物店:Zoobio
2018/05/23 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
结构和类有什么异同
2012/07/16 面试题
医学毕业生自荐信
2013/10/11 职场文书
语文教学感言
2014/02/06 职场文书
党员个人剖析材料
2014/09/30 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
何玥事迹观后感
2015/06/16 职场文书
退货证明模板
2015/06/23 职场文书
财务人员入职担保书
2015/09/22 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
学生安全责任协议书
2016/03/22 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书