TypeScript的命名空间-NameSpace

本文介绍了如何在TypeScript中使用命名空间(NameSpace)来管理全局变量,避免污染全局作用域。通过实例展示了从创建package.json、tsconfig.json,到编写page.ts和components.ts,并配置AMD模块和合并输出,详细解释了命名空间的使用方法和优势。同时,探讨了命名空间的嵌套以及在实际项目中的应用,帮助理解其在代码组织和封装上的作用。

初识TypeScript的命名空间-NameSpace

新建个TSWeb文件夹,在VScode中打开文件夹,新建终端,在终端中输入

// 生成package.json
npm init -y // -y 所有的配置都选择默认的

再运行生成tsconfig.json

ts -init

创建一个入口文件:index.html
完成配置
在这里插入图片描述
在这里插入图片描述
在src中创建page.ts,写入
在这里插入图片描述
在终端中运行 编译生成page.js

tsc

生成代码如下
在这里插入图片描述
打开文件夹和浏览器,把index.html拖拽到浏览器中,显示如下:
在这里插入图片描述

这里面代码中有个问题:都是全局变量。
代码量一大,这样操作会使全局变量过多,造成全局变量污染。
所以我们在就要使用-NameSpace
在page.ts 中用

namespace Home{
	class Header{.........}
	class Content{.........}
	class Footer{............}
	export c;ass Page{........} //暴露一个
}

再运行,再次编译更新page.js

tsc

在浏览器中F12打开console在里面输入查找Home.Footer、Home.Page
可以看到Home.Footer是显示undefined的,只有Home.Page是有显示的
在这里插入图片描述

namespace的好处: 让我们的全局变量变得很少,实现了基本的封装,减少了全局变量的污染。

深入了解TypeScript的命名空间-NameSpace

在src中新建一个components.ts
在这里插入图片描述
page.ts要修改一下
在这里插入图片描述
在index.html 中引用多个script会造成代码沉余,所以去tsconfig.json进行两个配置

"module": "amd", //把commonjs改成amd,因为commonjs不支持 outFile
"outFile": "./build/page.js",  //多个ts文件编译生成同一个json文件

命名空间也可进行嵌套
在这里插入图片描述

在终端运行编译

tsc

刷新浏览器页面,在控制台中可显示
在这里插入图片描述

### TypeScript 命名空间的适用情况 当处理较小规模的应用程序或特定功能模块时,如果希望避免全局命名污染并保持代码整洁有序,则可以考虑使用命名空间。然而,在现代Web开发实践中更倾向于采用ES6模块化方案[^3]。 对于遗留系统的迁移工作而言,利用命名空间能够逐步过渡到更加现代化的架构设计模式下而不至于一次性重构整个项目结构;另外,在某些特殊场合比如编写第三方库的时候也可以借助命名空间来封装内部实现细节从而保护私有成员不受外界干扰[^1]。 ### 使用场景示例 #### 场景一:防止变量冲突 假设在一个页面中有多个独立的功能区域都需要定义名为`User`的对象类型: ```typescript // 定义第一个命名空间中的 User 类型 namespace AdminPanel { export interface User { id: number; username: string; role: "admin"; } } // 定义第二个命名空间中的 User 类型 namespace PublicSite { export class User { constructor(public name: string, public email?: string) {} } } ``` 通过这种方式可以在不引起任何名称冲突的情况下分别创建两个具有相同名字但含义不同的实体[^4]。 #### 场景二:模拟类继承关系 有时为了简化依赖注入过程或者模仿面向对象编程里的继承机制,可以通过嵌套的方式构建层次化的命名空间体系: ```typescript namespace Shapes { export namespace Circle { export function draw(radius: number): void { console.log(`Drawing circle with radius ${radius}`); } } export namespace Rectangle { export function draw(width: number, height: number): void { console.log(`Drawing rectangle of width=${width},height=${height}`); } } } Shapes.Circle.draw(5); // Drawing circle with radius 5 Shapes.Rectangle.draw(10,20);// Drawing rectangle of width=10,height=20 ``` 上述例子展示了如何基于几何图形这一主题建立起一组相互关联却又各自独立存在的子命名空间集合。 ### 最佳实践建议 - **谨慎选用**:尽管命名空间有助于解决一些实际问题,但由于其局限性和潜在风险(如增加理解成本),除非必要否则应优先尝试其他解决方案例如ES Modules; - **合理规划**:一旦决定引入命名空间特性就要做好充分准备,包括但不限于提前构思好整体布局框架、制定清晰易懂的名字约定规则等措施以确保后续维护工作的顺利开展; - **适度运用**:即使是在适合应用命名空间的情境里也应当控制好数量范围以免过度分隔而导致难以追踪调试等问题的发生; - **文档记录**:及时更新相关说明文件以便团队成员之间共享知识经验共同进步。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值