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 + exportimport / export
隔离单位逻辑容器文件
加载方式靠脚本顺序 / reference按 import 关系自动解析
适用场景全局库、老代码、声明文件现代项目首选

小结

命名空间用容器隔离代码、防止全局冲突:export 控制可见性,支持嵌套、别名与跨文件合并。新项目建议优先用 ES 模块,只在全局脚本与 .d.ts 声明文件的场景中使用 namespace。

笔记加载中…