关于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 闭包疑问
Dec 30 Javascript
原生javascript和jquery判断浏览器版本等信息
Jul 04 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
Nov 25 Javascript
form.submit()不能提交表单的错误原因及解决方法
Oct 13 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
Jun 26 Javascript
jquery遍历table的tr获取td的值实现方法
May 19 Javascript
vue.js指令v-model使用方法
Mar 20 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
Jul 02 Javascript
浅谈vux之x-input使用以及源码解读
Nov 04 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
ES6 新增的创建数组的方法(小结)
Aug 01 Javascript
javascript实现计算器功能
Mar 30 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
JSON在PHP中的应用介绍
2012/09/08 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
Python中作用域的深入讲解
2018/12/10 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
腾讯公司的一个sql题
2013/01/22 面试题
司机辞职报告范文
2014/01/20 职场文书
教师业务学习制度
2014/01/25 职场文书
节约电力资源的建议书
2014/03/12 职场文书
校园活动宣传方案
2014/03/28 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
立项申请报告范本
2015/05/15 职场文书
小学运动会报道稿
2015/07/22 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书