命名空间(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 对象

更多推荐