关于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 相关文章推荐
JS和函数式语言的三特性
Mar 05 Javascript
超级好用的jQuery圆角插件 Corner速成
Aug 31 Javascript
动态的9*9乘法表效果的实现代码
May 16 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
JavaScript队列的应用实例详解【经典数据结构】
Apr 12 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
Apr 27 Javascript
修改node.js默认的npm安装目录实例
May 15 Javascript
Vue组件之单向数据流的解决方法
Nov 10 Javascript
vue 解决遍历对象显示的顺序不对问题
Nov 07 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
Aug 31 Javascript
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
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
php的一些小问题
2010/07/03 PHP
第五章 php数组操作
2011/12/30 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
Jquery 学习笔记(一)
2009/10/13 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
python 循环数据赋值实例
2019/12/02 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
python中append函数用法讲解
2020/12/11 Python
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
迪奥美国官网:Dior美国
2019/12/07 全球购物
连锁经营管理专业大学生求职信
2013/10/30 职场文书
致长跑运动员广播稿
2014/01/31 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
高中班主任心得体会
2016/01/07 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书