关于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 相关文章推荐
从URL中提取参数与将对象转换为URL查询参数的实现代码
Jan 12 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
jQuery实现tag便签去重效果的方法
Jan 20 Javascript
js实现带农历和八字等信息的日历特效
May 16 Javascript
全面了解JavaScript对象进阶
Jul 19 Javascript
Bootstrap缩略图与警告框学习使用
Feb 08 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
May 22 Javascript
webpack配置sass模块的加载的方法
Jul 30 Javascript
vue实现商城上货组件简易版
Nov 27 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
May 16 Javascript
通过实例了解js函数中参数的传递
Jun 15 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
PHP 文件扩展名 获取函数
2009/06/03 PHP
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
Javascript var变量隐式声明方法
2009/10/19 Javascript
JavaScript中的排序算法代码
2011/02/22 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
Angular的$http与$location
2016/12/26 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
Python爬取豆瓣视频信息代码实例
2019/11/16 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
党员创先争优公开承诺书
2014/03/28 职场文书
2014年党务公开方案
2014/05/08 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书