TypeScript 命名空间
命名空间(Namespace)给一组相关的函数、类、接口提供一个"容器",把它们挂到某个名字之下,避免污染全局作用域、防止命名冲突。它是早期 TypeScript 组织代码的方式,如今主要用在非模块的全局脚本与声明文件中。
基本使用
namespace MathUtil {
export const PI = 3.14159; // 必须 export 才对外可见
export function circleArea(r: number): number {
return PI * r * r;
}
}
// 通过 命名空间名.成员 访问
console.log(MathUtil.circleArea(2)); // 输出:12.56636
console.log(MathUtil.PI); // 输出:3.14159
未导出的成员
没有 export 的成员只在命名空间内部可用,外部访问会报错:
namespace Helper {
const secret = "内部值"; // 不导出:外部不可见
export function getSecret(): string {
return secret; // 命名空间内部可以使用
}
}
console.log(Helper.getSecret()); // 输出:内部值
// console.log(Helper.secret); // 报错:secret 没有导出
嵌套与别名
命名空间可以嵌套;层级太深时用 import 起别名缩短路径:
namespace Outer {
export namespace Inner {
// 嵌套时每一层都要 export
export const tag = "内层";
}
}
console.log(Outer.Inner.tag); // 输出:内层
import inner = Outer.Inner; // 别名:少写一层
console.log(inner.tag); // 输出:内层
组织类与接口,跨文件合并
接口、类、函数都能放进命名空间统一对外提供:
namespace Models {
export interface User {
name: string;
}
export class Admin implements User {
constructor(public name: string) {}
}
}
const admin = new Models.Admin("root");
console.log(admin.name); // 输出:root
同名命名空间可以跨文件自动合并:在传统多脚本页面中用三斜线指令串联文件,例如 /// <reference path="a.ts" />,两个文件里的同名 namespace 会合并成一个。
命名空间与模块的取舍
| 维度 | 命名空间 | 模块 |
|---|---|---|
| 语法 | namespace + export | import / export |
| 隔离单位 | 逻辑容器 | 文件 |
| 加载方式 | 靠脚本顺序 / reference | 按 import 关系自动解析 |
| 适用场景 | 全局库、老代码、声明文件 | 现代项目首选 |
小结
命名空间用容器隔离代码、防止全局冲突:export 控制可见性,支持嵌套、别名与跨文件合并。新项目建议优先用 ES 模块,只在全局脚本与 .d.ts 声明文件的场景中使用 namespace。