关于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图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
Nov 09 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
Apr 22 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
Bootstrap 实现查询的完美方法
Oct 26 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
Aug 16 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
Sep 21 Javascript
js的各种数据类型判断的介绍
Jan 19 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
Apr 26 Javascript
vue中使用vee-validator完成表单校验方案
Nov 01 Javascript
使用React代码动态生成栅格布局的方法
May 24 Javascript
JS数据类型分类及常用判断方法
Nov 19 Javascript
JS实现纸牌发牌动画
Jan 19 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文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
深入PHP curl参数的详解
2013/06/17 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
jQuery 加上最后自己的验证
2009/11/04 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
Python Trie树实现字典排序
2014/03/28 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
python妹子图简单爬虫实例
2015/07/07 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
Python关于反射的实例代码分享
2020/02/20 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
《赵州桥》教学反思
2014/02/17 职场文书
给医院的感谢信
2015/01/21 职场文书
2016教师节感恩话语
2015/12/09 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python