如何理解 TypeScript 中命名空间与模块?两者都有那些区别?如何更好的应用?

在 TypeScript 中,命名空间(Namespace)和模块(Module)是两种不同的代码组织方式,用于组织和管理代码结构,避免命名冲突和提高可维护性。虽然它们都可以将代码划分为不同的逻辑单元,但在使用上有一些区别。

1. 命名空间(Namespace)

命名空间是一种将代码逻辑分组的方式,通常用于将相关功能组织在一个全局对象下,防止全局作用域中的变量冲突。命名空间在 TypeScript 中使用 namespace 关键字定义。

特点:
  • 内联声明:命名空间中的代码是内联的,意味着它们通常会在一个文件内进行定义,甚至可以在同一个文件的不同部分访问。
  • 全局作用域:命名空间的内容是全局可见的,但它通过组织成一个命名空间来避免命名冲突。
  • 通常适用于小型项目:对于较小的项目或者需要避免模块化工具时,命名空间较为适用。
示例代码:
namespace MathOperations {export function add(a: number, b: number): number {return a + b;}export function subtract(a: number, b: number): number {return a - b;}
}// 使用命名空间中的方法
let result = MathOperations.add(5, 3);
console.log(result); // 输出 8

解释

  • 这里我们定义了一个 MathOperations 命名空间,并在其中包含了两个导出的函数 addsubtract
  • export 关键字是必须的,它让命名空间中的成员可以在外部访问。
  • 在外部使用时,只需要通过 MathOperations.add() 来调用命名空间中的方法。
命名空间的优势:
  • 适合较小项目,或者不使用模块化系统的场景。
  • 通过命名空间可以避免全局作用域的命名冲突。
命名空间的劣势:
  • 在大型项目中,代码可能变得难以维护,因为命名空间可能变得很庞大。
  • 不能进行按需加载,所有代码都需要在文件加载时一起加载。

2. 模块(Module)

模块是 TypeScript 和 ES6 引入的标准化的代码组织方式,模块化是为了让代码更加可维护、可重用以及可按需加载。模块使用 importexport 关键字来组织代码,每个文件都视为一个独立的模块,模块之间可以进行导入和导出。

特点:
  • 文件级别作用域:每个模块都有自己的作用域,模块外的变量不会影响模块内部的代码。
  • 显式导入导出:模块中的代码必须显式导出才能被其他模块访问,而使用其他模块中的内容时必须通过 import 明确引入。
  • 适用于大型项目:模块化通常适用于大规模应用开发,具有更高的可维护性和扩展性。
  • 支持按需加载:支持现代的构建工具(如 Webpack)进行按需加载。
示例代码:

假设我们有两个文件 math.tsapp.ts

math.ts
// math.ts
export function add(a: number, b: number): number {return a + b;
}export function subtract(a: number, b: number): number {return a - b;
}
app.ts
// app.ts
import { add, subtract } from './math';let sum = add(5, 3);
console.log(sum); // 输出 8let diff = subtract(5, 3);
console.log(diff); // 输出 2

解释

  • math.ts 文件中,我们使用 export 导出了 addsubtract 函数,这样它们就可以被其他文件导入。
  • app.ts 中,使用 import 引入了 addsubtract 函数,并使用它们进行计算。
  • 每个文件本身都是一个模块,它们有自己的作用域,不会干扰其他文件中的代码。
模块的优势:
  • 清晰的代码组织:每个文件都是独立的模块,代码组织更加清晰。
  • 按需加载:模块支持按需加载,可以通过构建工具进行优化,减少文件大小。
  • 避免全局污染:模块内的变量不会污染全局作用域,避免了命名冲突。
  • 适合大型应用:模块化结构非常适合大型项目,增强了代码的可维护性和可复用性。
模块的劣势:
  • 如果不合理设计模块依赖关系,可能导致循环依赖的问题。
  • 需要现代的模块化工具和构建系统,如 Webpack、Rollup 等。

3. 命名空间与模块的区别

特性命名空间 (Namespace)模块 (Module)
作用域全局作用域,命名空间通过组织代码避免冲突。每个文件都有自己的局部作用域。
代码组织方式将相关功能集中到同一个命名空间下,文件不一定需要拆分。每个文件是一个独立的模块,代码必须拆分成多个文件。
导入导出方式使用 export 导出,文件间没有显式的 import使用 importexport 显式导入导出。
使用场景适用于较小的项目或不需要模块化工具的简单应用。适用于大型项目,支持模块化构建和按需加载。
循环依赖命名空间之间不能有循环依赖。支持循环依赖,但要小心使用。
全局污染命名空间成员仍然属于全局,可能会影响其他部分代码。模块内部变量仅在该模块内有效,避免了全局污染。

4. 实际项目中的使用示例

假设我们有一个简单的电商应用,模块化可以帮助我们组织不同的功能,如用户管理、商品管理、订单管理等。

文件结构:
/src/modulesuser.tsproduct.tsorder.ts/app.ts
user.ts(用户管理模块):
// user.ts
export function createUser(name: string, age: number) {return { name, age };
}
product.ts(商品管理模块):
// product.ts
export function createProduct(name: string, price: number) {return { name, price };
}
order.ts(订单管理模块):
// order.ts
import { createUser } from './user';
import { createProduct } from './product';export function createOrder(userName: string, userAge: number, productName: string, productPrice: number) {const user = createUser(userName, userAge);const product = createProduct(productName, productPrice);return { user, product, status: "Pending" };
}
app.ts(应用入口):
// app.ts
import { createOrder } from './modules/order';const order = createOrder("Alice", 30, "Laptop", 1000);
console.log(order);
解释:
  • user.tsproduct.tsorder.ts 都是独立的模块,分别处理用户、商品和订单的逻辑。
  • app.ts 是应用的入口,负责引入并使用这些模块。
  • 每个模块的代码都隔离在自己的作用域内,不会污染全局作用域,模块之间的依赖关系通过 importexport 显式建立。

结论

  • 命名空间:适用于较小的项目,能够将相关的功能组织在一起,避免命名冲突,但在大型项目中可能变得不够灵活。
  • 模块:适用于大型项目,通过文件级作用域和显式导入导出机制提供了更好的模块化支持,能够更好地组织代码、支持按需加载并避免全局污染。

根据项目的大小、复杂度和构建工具的使用情况,你可以选择适合的组织方式。在现代开发中,模块化已经成为主流,特别是在使用现代构建工具时,模块化能够帮助你更高效地开发和维护项目。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低速接口项目之串口Uart开发(四)——UART串口实现FPGA内部AXILITE寄存器的读写控制

本节目录 一、设计背景 二、设计思路 三、逻辑设计框架 四、仿真验证 五、上板验证 六、往期文章链接本节内容 一、设计背景 通常,芯片手册或者IP都会提供一系列的用户寄存器以及相关的定义,用于软件开发人员进行控制底层硬件来调试,或封装…

git branch -d 删除分支

Git进行版本控制时,删除分支是常见的操作。特别是当特定的功能开发完成或者分支不再需要时,删除分支可以帮助保持仓库的整洁。删除本地分支和删除远端分支是两个独立的操作。如果需要同时删除本地和远端的分支,需要分别执行以下两个命令。 一…

Linux环境开启MongoDB的安全认证

文章目录 1. MongoDB安全认证简介1.1 访问控制1.2 角色1.3 权限 2. MongoDB中的常见角色3. MongoDB Shell3.1 下载MongoDB Shell3.2 通过MongoDB Shell连接MongoDB 4. 创建管理员用户5. 为具体的数据库创建用户6. 开启权限认证7. 重启MongoDB服务8. 连接MongoDB9. MongoDB数据库…

PVE的优化与温度监控(二)—无法识别移动硬盘S.M.A.R.T信息的思考并解决

前情提要:空闲2.5英寸机械硬盘,直接放到PVE上测试NAS 使用,通过SATA线的方式让小主机不太美观,并且失去了前期调试的安全性。购入移动硬盘盒,缺点,USB 连接,会失去一些特性。比如本文中遇到的问…

嵌入式硬件实战基础篇(二)-稳定输出3.3V的太阳能电池-无限充放电

引言:本内容主要用作于学习巩固嵌入式硬件内容知识,用于想提升下述能力,针对学习稳压芯片和电容以及电池之间的运用,对于硬件PCB以及原理图的练习和前面硬件篇的实际运用;太阳能是一种清洁、可再生的能源,广…

OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::fisheye::calibrate 函数是 OpenCV 中用于校正鱼眼镜头畸变的一个重要函数。该函数通过一系列棋盘格标定板的图像来计算相机的内参矩阵和畸变…

【过程控制系统】第6章 串级控制系统

目录 6. l 串级控制系统的概念 6.1.2 串级控制系统的组成 6.l.3 串级控制系统的工作过程 6.2 串级控制系统的分析 6.2.1 增强系统的抗干扰能力 6.2.2 改善对象的动态特性 6.2.3 对负荷变化有一定的自适应能力 6.3 串级控制系统的设计 6.3.1 副回路的选择 2.串级系…

24/11/22 项目拆解 艺术风格转移

我们有时候想把两种艺术风格整合,创造更具艺术特色的艺术品,人很难办到,但是人工智能可以,比如下面将艺术画的风格转移到照片上。 我们先来初步了解一下实现上述功能的数学原理 所谓艺术风格,其实就是边缘,颜色&#…

Unity图形学之CubeMap立方体贴图

1.CubeMap:有六个面的贴图组成 2. 假反射:反射天空盒子 (1)正常UV采样: (2)Cube的采样:利用反射角采样,反射角X和Cube的交点采样 Shader "Custom/TestReflect"…

LLM Inference Unveiled

题目:LLM Inference Unveiled: Survey and Roofline Model Insights 链接:https://arxiv.org/abs/2402.16363 这也是一篇推理加速的综述,重点关注一下它的组织结构吧,也就是它对推理加速方法的分类 论文给的全文结构图&#xff…

Cesium的ClearCommand的流程

ClearCommand是在每帧渲染前可以将显存的一些状态置为初始值,就如同把擦黑板。当然也包括在绘制过程中擦掉部分的数据,就如同画家在开始绘制的时候会画导览线(如透视线),轮廓出来后这些导览线就会被擦除。 我画了一个…

【Linux】重定向,dup

目录 文件描述符分配规则 重定向 dup ​编辑 输出重定向 追加重定向 输入重定向。 重定向会影响后面的程序替换吗? 1号文件和2号文件 2号文件输出重定向 下标之间的重定向 文件描述符分配规则 重定向 把显示器文件关闭后,本来应该写给显示器…

大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法

1. 梯度介绍 如果我们在一座山上(一个山的坡度有很多,陡峭的,平缓的),想要从山顶下山。而梯度就像告诉我们如何沿着最陡的下坡路线走,以尽快到达山脚(最低点)。 2. 梯度的定义 梯度…

【JAVA】一次操蛋的nginx镜像之旅

一、前言 由于我们的项目中使用到了nginx,同时我们的nginx是通过docker镜像进行安装的,由于nginx出现了问题,需要重新安装。于是。。。 二、通过docker进行安装 docker pull nginx:latest 1.5.2 脚本文件 在/home/docker/script路径下创…

ubuntu24挂载硬盘记录

1、显示硬盘及所属分区情况。在终端窗口中输入如下命令: sudo fdisk -l 找到自己硬盘的分区 我的地址/dev/sda 2、显示硬盘及所属分区情况。在终端窗口中输入如下命令,格式化自己硬盘: sudo mkfs -t ext4 /dev/sda 3、在终端窗口中输入如下…

业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架,旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…

苹果Siri将搭载大型语言模型,近屿智能抢占AIGC大模型人才培养高地

据媒体报道,苹果公司正在研发一款全新升级、更加智能且对话能力显著提升的Siri,意在超越OpenAI的ChatGPT及其他语音服务。 报道指出,新一代Siri将搭载更为先进的大型语言模型(LLM),苹果期望其能够进行连续…

【1.4 Getting Started--->Support Matrix】

主页:支持矩阵 这些支持矩阵概述了 TensorRT API、解析器和层支持的平台、特性和硬件功能。 Support Matrix Abstract 这些支持矩阵概述了 TensorRT API、解析器和层所支持的平台、功能和硬件功能。 有关之前发布的 TensorRT 文档,请参阅 TensorRT 档…

WPF中如何让Textbox显示为一条直线

由于Textbox直接使用是一条直线 设置如下代码 可以让Textbox变为直线输入 <Style TargetType"TextBox"x:Key"UsernameTextBoxStyle"><Setter Property"Template"><Setter.Value><ControlTemplate TargetType"{x:Typ…

Mac 修改默认jdk版本

当前会话生效 这里演示将 Java 17 版本降低到 Java 8 查看已安装的 Java 版本&#xff1a; 在终端&#xff08;Terminal&#xff09;中运行以下命令&#xff0c;查看已安装的 Java 版本列表 /usr/libexec/java_home -V设置默认 Java 版本&#xff1a; 找到 Java 8 的安装路…