TypeScript :命名空间(Namespace)
·
命名空间(Namespace)是 TypeScript 提供的一种代码组织机制,用于解决全局作用域中的命名冲突问题。它类似于文件系统中的文件夹,将相关代码封装在独立的作用域内。
核心概念与用法
1.基本定义
使用 namespace 关键字定义命名空间:
namespace MyUtilities {
export function log(message: string) {
console.log(message);
}
}
MyUtilities.log("Hello Namespace!"); // 调用
-
export暴露成员供外部访问 -
未导出的成员仅在命名空间内部可见
2.嵌套命名空间
支持层级嵌套:
namespace Outer {
export namespace Inner {
export const PI = 3.14;
}
}
console.log(Outer.Inner.PI); // 3.14
3.多文件扩展
同名命名空间会自动合并:
// file1.ts
namespace Database {
export interface User { id: number; }
}
// file2.ts
namespace Database {
export function getUser(id: number): User { /* ... */ }
}
4.简化调用(别名)
使用 import 创建别名:
import Util = MyUtilities;
Util.log("Alias works!");
与模块(Module)的区别
| 特性 | 命名空间 | ES6 模块 |
|---|---|---|
| 作用域 | 逻辑分组(单/多文件) | 文件级作用域(每个文件即模块) |
| 加载方式 | 通过 <script> 标签顺序加载 | 静态导入(import/export) |
| 适用场景 | Web 全局环境、旧项目迁移 | 现代应用、浏览器/Node.js |
| 依赖管理 | 手动管理(三斜线指令 ///<reference>) | 自动解析依赖 |
实际应用场景
1.浏览器环境
避免污染全局 window 对象:
namespace CompanyLib {
export class Logger { /* ... */ }
}
// 浏览器中通过 window.CompanyLib 访问
2.第三方库开发
兼容旧版全局变量模式:
declare global {
namespace myLib {
function init(): void;
}
}
3.渐进式迁移
将遗留代码逐步封装到命名空间,再过渡到模块系统。
注意事项
-
现代项目优先使用模块:命名空间主要面向传统全局脚本场景
-
避免深层嵌套:超过 3 层会降低可读性
-
编译输出:命名空间会被编译为 IIFE(立即执行函数)包裹的 JavaScript 对象
更多推荐


所有评论(0)