关于TypeScript模块导入的那些事

作者:三毛丶 时间:2024-06-07 15:57:46 

前言

模块在其自身的作用域里执行,而不是在全局作用域里;这意味着定义在一个模块里的变量,函数,类等等在模块外部是不可见的,除非你明确地使用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

来源:https://juejin.im/post/5a2cce856fb9a0450e760ca3

标签:typescript,模块,导入
0
投稿

猜你喜欢

  • Python实现关键路径和七格图计算详解

    2022-04-25 12:17:46
  • Python结巴中文分词工具使用过程中遇到的问题及解决方法

    2023-04-28 18:23:28
  • 在HTML中,常见的URL有多种表示方式:

    2009-07-28 12:18:00
  • Python操作json数据的一个简单例子

    2022-10-23 17:09:37
  • 在Django中创建URLconf相关的通用视图的方法

    2021-09-17 06:07:58
  • vue $mount 和 el的区别说明

    2024-04-28 09:20:24
  • Instr函数与InstrRev函数的区别

    2008-07-07 16:53:00
  • 如何利用pycharm进行代码更新比较

    2022-06-21 17:13:09
  • 基于python调用psutil模块过程解析

    2022-04-09 18:22:56
  • Vue 自定义指令实现一键 Copy功能

    2024-05-05 09:08:48
  • vscode+PyQt5安装详解步骤

    2021-07-27 23:52:55
  • python 对xml解析的示例

    2023-05-30 23:06:31
  • Python+Pygame制作"长沙版"大富翁

    2023-10-05 06:53:08
  • Mysql字符串截取及获取指定字符串中的数据

    2024-01-24 21:07:46
  • 关于JDBC与MySQL临时表空间的深入解析

    2024-01-22 04:11:14
  • MybatisPlus如何处理Mysql的json类型

    2024-01-27 14:23:19
  • Python代理抓取并验证使用多线程实现

    2022-07-10 07:04:19
  • Matplotlib中rcParams使用方法

    2022-12-14 03:41:46
  • 解决tensorflow由于未初始化变量而导致的错误问题

    2023-06-05 17:44:05
  • 不完全HTML在线编辑器收集

    2007-11-08 12:20:00
  • asp之家 网络编程 m.aspxhome.com