关于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 相关文章推荐
jQuery-Easyui 1.2 实现多层菜单效果的代码
Jan 13 Javascript
Javascript 多浏览器兼容总结(实战经验)
Oct 30 Javascript
js实现文章文字大小字号功能完整实例
Nov 01 Javascript
jQuery中:enabled选择器用法实例
Jan 04 Javascript
在AngularJS框架中处理数据建模的方式解析
Mar 05 Javascript
微信小程序 Audio API详解及实例代码
Sep 30 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
Jan 21 Javascript
使用BootStrap实现标签切换原理解析
Mar 14 Javascript
Vue.js实现文章评论和回复评论功能
May 30 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
Sep 27 Javascript
微信小程序实现蓝牙打印
Sep 23 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
Jun 05 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/29 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
node和vue实现商城用户地址模块
2018/12/05 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
Python实现二分法算法实例
2015/02/02 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
批处理与python代码混合编程的方法
2016/05/19 Python
python自动翻译实现方法
2016/05/28 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
Python实现的科学计算器功能示例
2017/08/04 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
python创建n行m列数组示例
2019/12/02 Python
Python 音频生成器的实现示例
2019/12/24 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
岗位职责定义及内容
2013/11/08 职场文书
绿色小区申报材料
2014/08/22 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书