第十一章 TypeScript模块和命名空间的介绍和使用


文章目录

  • 一、模块
    • 1. 导出
      • 基础导出
      • 重新导出
      • 导出重命名
    • 2. 导入
      • 基础导入
      • 导入重命名
    • 3. 默认导出
    • 4. 模块化兼容
      • exports =
      • import = require('')
      • 编译结果
  • 二、命名空间
    • 1. 例子
    • 2. 命名空间
    • 3. 引入命名空间
  • 三、模块和命名空间

一、模块

  • JavaScript 在 ES2015 中引入了模块的概念,我们的 JS 也开始进行了标准的模块化开发阶段,在 TS 内沿用了这个概念
  • 在 TS 中,从语法到概念,其实和 JavaScript 中基本一致的

1. 导出

  • 在一个文件中,所有的声明都可以利用 export 关键字进行导出
  • 其实就是向外暴露该内容,被其他模块使用

基础导出

  • moduleA.ts
// 导出一个变量
export const num = 100
export const str = 'hello world'
export const reg = /^千锋教育$/

// 导出一个函数
export function fn() {}

// 导出一个类
export class Student {}
export class Person extends People {}

// 导出一个接口
export interface Users {}

重新导出

  • 有的时候我们可能会在某一个文件内导入一段内容,然后再次进行导出
  • modeuB.ts
export * from './moduleA'
  • 在这个 moduleB 文件中导入了 moduleA 文件的所有内容
  • 并且在 moduleB 中也进行了一次导出
  • 可能很多小伙伴就要问了,这个有什么意义吗 ?
  • 其实是可以做一些模块合并的
  • 举个例子
  • moduleA.ts
export const num = 100
  • moduleB.ts
export const str = 'hello world'
  • moduleC.ts
export interface Users {}
  • moduleIndex.ts
export * from './moduleA'
export * from './moduleB'
export * from './moduleC'
  • 这样一来,就相当于用 moduleIndex 文件对前面三个模块进行可一个整合导出

导出重命名

  • 有的时候,我们在重新导出的时候,有可能会遇到一些多个模块的重名问题
  • 或者说会遇到多个模块因为不是一个人书写的,导致模块命名风格不统一
  • 我们在书写的时候,就可以在导出的时候做一个重命名
  • 语法
export { num as current } from './moduleA'
  • 相当于在这个文件中导入了 moduleA 模块中的 num 数据
  • 并且进行了再次导出
  • 只不过进行再次导出的时候,用的名字是 current 而已
  • 举个例子
  • moduleA.ts
export const n = 100
  • moduleB.ts
export const s = 'hello world'
  • moduleC.ts
export interface Aaa {}
  • moduleIndex.ts
export { n as num } from './moduleA'
export { s as str } from './moduleB'
export { Aaa as Users } from './moduleC'
  • 这样一来,就相当于用 moduleIndex 文件对前面三个模块进行可一个整合导出
  • 并且对以上三个模块导出的内容进行了重命名
  • 等价于
// 伪代码,仅仅为了直观看一下上面代码的效果
export const num = 100 // moduleA 中导出的 n
export const str = 'hello world' // moduleB 中导出的 s
export interface Users {} // moduleC 中导出的 Aaa

2. 导入

  • 和上面导出是配套出现的

基础导入

  • 直接导出某一个模块的某个或者某些内容
  • moduleA.ts => 进行导出
export function study () {}
export function play () {}
export function sleep () {}
  • index.ts => 进行导入
import { study, play } from './moduleA'

导入重命名

  • 导入的时候,有的时候,我们可能不想用原先文件内导出的名字
  • 不管是因为命名冲突问题还是嫌原先的名字太长,都有可能
  • 那么我们就可以进行重命名的操作了
  • moduleA.ts => 进行导出
export function study () {}
export function play () {}
export function sleep () {}
  • index.ts => 进行导入
import { study as s } from './moduleA'
  • 相当于在 moduleA 内导出了一个 study 方法
  • 但是在 index 文件内使用的时候,使用 s 这个函数名

3. 默认导出

  • 每个模块都会有一个默认导出,使用 default 来进行
  • 需要注意 : 一个模块只能有一个默认导出
  • moduleA.ts
const utils = {
  study () {},
  play () {},
  sleep () {}
}

export default utils
  • 这是在 moduleA 内以默认导出形式导出了 utils 这个对象
  • index.ts
import XhlUtils from './moduleA'
  • 这里在 index 内的 XhlUtils 得到的就是 moduleA 文件内导出的 utils 对象

4. 模块化兼容

  • 之前的都是 JS 的模块化语法,我们相当于复习或者回顾
  • 现在这一块是 TS 对模块化的增强了,各位小伙伴要注意学习了哦

前言 :

我们刚才说的其实都是 ES6 Module 的语法规范

但是我们直到,在 JS 的发展进程中,我们并不是只有这一个模块化语法规范

我们还有 AMD / CommonJS / UMD 等模块化语法规范

各自有各自的导入导出语法规范

但是在这几个语法内有一个共同的规范,就是 exports 变量的出现

exports 变量

在 CommonJS 和 AMD 内都有 exports 这个对象

就是这两个模块化规范的默认导出,相当于 ES6 模块化规范内的 export default

虽然大家的语法是相似,并且意义也差不多

但是 ES6 模块化语法,并不能兼容 CommonJS 和 AMD 语法规范

所以在 TS 内对 ES6 的模块化语法进行了一些扩展

可以在编译的时候,更好的支持 CommonJS 的语法

exports =

  • 如果你只是使用 TS 进行前端开发,不需要考虑模块化语法的兼容,那么你不需要了解这个
  • 只有当你需要兼容 CommonJS 和 AMD 语法的时候
  • 那么我们的 export default 就不能用了
  • index.ts => 不考虑兼容性
class Person {}

export default Person
  • index.ts => 考虑兼容
class Person {}

export = Person

import = require(‘’)

  • 为了支持兼容,我们的导出语法变了,那么我们的导入语法也要变化
  • index.ts => 不考虑兼容
import Person from './xxx'
  • index.ts => 考虑兼容
import Person = require('./xxx')

编译结果

  • 如果你按照兼容方式书写的导出内容,会被编译成一下几个情况(看看得了)
  • SimpleModule
import Person = require('./xxx')
  • AMD( requireJS )
define(["require", "exports", "./xxx"], function (require, exports, mod_1) {
  console.log(mod_1)
});
  • CommonJS( node )
const Person = require('./xxx')
  • UMD
(function (factory) {
  if (typeof module === "object" && typeof module.exports === "object") {
    let v = factory(require, exports); if (v !== undefined) module.exports = v
  }
  else if (typeof define === "function" && define.amd) {
    define(["require", "exports", "./xxx"], factory)
  }
})(function (require, exports) {
  let Person = require("./xxx")
  console.log(Person)
});
  • System SimpleModule
System.register(["./xxx"], function(exports) {
  let Person
  return {
    setters: [
      function (param) {
        Person = param
      }],
    execute: function() {
      console.log(Person)
    }
  }
})
  • Native ES6 Module
import Person from './xxx'

二、命名空间

前言 :

最早的 TS 里面,是没有命名空间的概念的,就是模块化的概念

分成了两种,内部模块 和 外部模块

从 TS1.5 开始,内部模块 改名为 命名空间,所以其实 命名空间 就是 内部模块

那么我们如何他们呢,其实主要还是从内部封装的内容上来区分

命名空间(内部模块) : 主要用于组织代码,避免命名冲突

外部模块(模块) : 侧重代码的封装复用,一个模块内可能包含多个命名空间

1. 例子

  • 我们在开发的过程中,如果一个 ts 文件没有书写模块化语法
  • 那么会默认这个文件内所有定义的变量都是挂载在全局上的
  • 那么两个文件内就不能出现重复变量名,不然会出现问题
  • a.ts
const num = 100
const str = 'hello world'
  • b.ts
const num = 200
  • 看似没有关系的两个文件,只是都写了 num 变量
  • 但是因为没有模块化语法,这两个就都是挂载在全局的变量

  • 这个时候,我们就可以把这些内容放在命名空间( 内部模块 )内来解决这个问题

2. 命名空间

  • 语法 :
namespace 命名 {
  /* ... */
}
  • 在命名空间内可以定义变量使用,也可以向外暴露内容
  • 在命名空间内向外暴露内容也是使用 export 关键字
namespace GoodsHandler {
  const current = 1
  const pagenum = 10
  const info = []

  export const list = info.slice((current - 1) * pagenum, current * pagenum)
}
  • 这样一来,我们所有的内容就放在了这个叫做 GoodsHandler 的命名空间内
  • 其中三个变量别的地方用不了,只能在当前命名空间内使用
  • 向外暴露了一个叫做 list 的内容

3. 引入命名空间

  • 当我们需要使用一个命名空间的时候,我们可以使用三斜线(///) 指令
  • 注意 : 三斜线(///) 指令必须要要用在文件的最开始
// <reference path="./goodsHandler.ts" />
console.log(GoodsHandler.list)

三、模块和命名空间

  • 当我们使用 模块 和 命名空间 组织我们的代码以后
  • 我们的向外暴露的内容越来越多,也会考虑到文件太多的问题
  • 所以有的时候我们可以把命名空间和模块放在一起使用
  • 也就是在一个模块内,可以导出多个 命名空间
  • 分清作用和概念
  • 命名空间: 主要为了解决变量命名冲突
  • 模块: 组织代码,复用
export namespace GoodsHandler { /* ... */ }
export namespace ListHandler { /* ... */ }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900446.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【331】基于Springboot的“有光”摄影分享网站系统

“有光”摄影分享网站设计与实现 摘 要 自互联网的发展至今&#xff0c;其基础理论与技术都已完善&#xff0c;并积极参与了整个社会各个领域。它容许信息根据媒体传播&#xff0c;并和信息可视化工具一起为大家提供优质的服务。对于信息多头管理、差错率高、信息安全系数差、…

【GAMES101笔记速查——Lecture 18 Advanced Topics in Rendering】

目录 1 渲染前沿 1.1 有偏vs无偏 1.2 无偏光线传播方法&#xff08;Unbiased light transport methods&#xff09; 1.2.1 双向路径追踪&#xff08;Bidirectional path tracing&#xff0c;BDPT&#xff09; &#xff08;1&#xff09;双向路径追踪(BDPT)举例 1.2.2 Metr…

《等保测评新视角:安全与发展的双赢之道》

在数字化转型的浪潮中&#xff0c;企业面临的不仅是技术革新的挑战&#xff0c;更有信息安全的严峻考验。等保测评&#xff0c;作为国家网络安全等级保护的一项重要措施&#xff0c;不仅为企业的安全护航&#xff0c;更成为推动企业高质量发展的新引擎。本文将从全新的视角&…

中航资本:光伏股,集体涨停!千亿龙头,罕见封板!

今日早盘&#xff0c;A股放量走强&#xff0c;半日成交超越万亿元。北证50指数持续放量上攻&#xff0c;飙升逾8%&#xff0c;再创前史新高&#xff0c;创业板指大涨逾3%&#xff0c;克复2200点&#xff0c;上证指数站上3300点。 盘面上&#xff0c;BC电池、固态电池、房地产、…

迁移学习|ResNet18

一、导入库 二、设置随机种子 三、数据增强和数据加载 四、加载预训练模型 五、定义损失函数和优化器 六、学习率调度器 七、训练模型 八、可视化训练过程 九、总结 1. 常见优化器概述 1.1 随机梯度下降&#xff08;SGD: Stochastic Gradient Descent&#xff09; 简介&…

CentOS系统Nginx的安装部署

CentOS系统Nginx的安装部署 安装包准备 在服务器上准备好nginx的安装包 nginx安装包下载地址为&#xff1a;https://nginx.org/en/download.html 解压 tar -zxvf nginx-1.26.1.tar.gz执行命令安装 # 第一步 cd nginx-1.26.1# 第二步 ./configure# 第三步 make# 第四步 mak…

基于RabbitMQ,Redis,Redisson,RocketMQ四种技术实现订单延时关闭功能及其相关优缺点介绍(以12306为主题)

目录 1. 延迟关闭订单 1.1 订单延时关闭功能技术选型 1.1.1 定时任务 1.1.2 RabbitMQ 1.1.3 Redis 过期监听 1.1.4 Redisson 1.1.5 RocketMQ 1.2 RocketMQ订单延时关闭发送方实现 1.3 RocketMQ订单延时关闭的消费方实现 1. 延迟关闭订单 用户发起订单后&#xff0c;如…

校园表白墙源码修复版

此校园表白墙源码基于thinkphp&#xff0c;因为时代久远有不少bug&#xff0c;经本人修复已去除大部分bug&#xff0c;添加了美化元素。 https://pan.quark.cn/s/1f9b3564c84b https://pan.baidu.com/s/1bb9vu9VV2jJoo9-GF6W3xw?pwd7293 https://caiyun.139.com/m/i?2hoTc…

Etcd 可观测最佳实践

简介 Etcd 是一个高可用的分布式键值存储系统&#xff0c;它提供了一个可靠的、强一致性的存储服务&#xff0c;用于配置管理和服务发现。它最初由 CoreOS 开发&#xff0c;现在由 Cloud Native Computing Foundation (CNCF) 维护。Etcd 使用 Raft 算法来实现数据的一致性&…

AI运动抽取转3D动画

用的Wonder Studio&#xff0c;不免费哈&#xff0c;也不能试了&#xff0c;都要钱。只能看别人的经验。 网址https://wonderdynamics.com/ 先别激动&#xff0c;参考别人的评论 登录后&#xff08;google登录&#xff09;界面如下 收费情况 视频教程 https://www.youtube.co…

【记录】VSCode|自用设置项

文章目录 1 基础配置1.1 自动保存1.2 编辑区自动换行1.3 选项卡换行1.4 空格代替制表符1.5 开启滚轮缩放 2 进阶设置2.1 选项卡不自我覆盖2.2 选项卡限制宽度2.3 选项卡组限制高度2.4 字体设置2.5 字体加粗2.6 侧边栏2.7 沉浸式代码模式 Zen Mode2.8 设置 Zen 模式的选项卡组 3…

深入了解 kotlinx-datetime:配置与使用指南

深入了解 kotlinx-datetime&#xff1a;配置与使用指南 在Kotlin多平台开发中&#xff0c;处理日期和时间是常见的需求。kotlinx-datetime库提供了强大且简洁的API来帮助开发者应对这一挑战。本文将详细介绍如何配置kotlinx-datetime库&#xff0c;并通过生动的示例演示其核心…

远程:HTTP基本身份验证失败。提供的密码或令牌不正确,或者您的账户启用了两步验证,您必须使用个人访问令牌而不是密码。

问题描述&#xff1a; remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token insteadof a password. See http://gitlab.cnovit.com/help/topics/git/troubleshooting…

从 Hadoop 迁移到数据 Lakehouse 的架构师指南

从 Hadoop 到数据湖仓一体架构的演变代表了数据基础架构的重大飞跃。虽然 Hadoop 曾经以其强大的批处理能力统治着大数据领域&#xff0c;但如今的组织正在寻求更敏捷、更具成本效益和现代化的解决方案。尤其是当他们越来越多地开始实施 AI 计划时。根本没有办法让 Hadoop 为 A…

C++ 类与对象(中) 默认成员函数

我们知道在类中&#xff0c;有成员变量和成员函数&#xff0c;我们可以通过创造不同的成员函数来实现这个类不同的功能&#xff0c;如果我们创造一个类&#xff0c;却不实现它的成员函数会如何呢&#xff1f;这个就涉及到类中的默认成员函数的概念了。但在本文我们主要介绍以下…

【Dash】feffery_antd_components 按钮组件的应用

一、feffery_antd_componenet 中的 AntdFloatButton 和 AntdFloatButtonGroup AntdFloatButton 和 AntdFloatButtonGroup 是两个用于创建悬浮按钮和悬浮按钮组的组件。 AntdFloatButton 是单个悬浮按钮组件&#xff0c;它提供了多种属性来定义按钮的外观及行为。AntdFloatBut…

WebView渲染异常导致闪退解决方案

背景&#xff1a; App主页面使用了大量WebView容器(10个以上)显示图表信息&#xff0c;最新发现bugly上面出现一些关于浏览器Native Crash&#xff0c;如下&#xff1a; 经排查&#xff0c;是WebView渲染失败导致Crash&#xff0c;可以通过webView.loadUrl("chrome://cra…

Pycharm搭配miniConda(Anaconda的轻量版本)建立虚拟环境管理不同项目不同依赖

需求 pip安装的版本会在全局环境下生效,导致不用的项目使用的是同一套环境,容易出现别人的项目跑的好好的,到了自己电脑就不能跑的问题需求 1.不同的项目可以设置不同的环境,同时支持自动切换环境2.便捷,轻量化管理当前的环境 如果可以,最好有一个可视化的平台,anaconda倒是支…

图像分割-DeepLab

DeepLabV3源码链接&#xff1a;https://github.com/bubbliiiing/deeplabv3-plus-pytorch&#xff08;打不开私信我获取&#xff09; 一、简介 一般的模型如Unet一般用于医学领域&#xff0c;小目标&#xff0c;如细胞分割。 为了增大感受野&#xff08;从而更好的获得全局特征…