Skip to content

命名空间

在 TypeScript 中,是一种将相关类型(如类、接口、函数等)组织在一起的方式,以避免全局命名冲突,并提供一种模块化的代码组织结构。命名空间有助于在大型项目中保持类型和实现的组织性与清晰性。下面是命名空间的基本使用方法和一些关键概念:

基本语法

ts
namespace MyNamespace {
  export class MyClass {
    public myMethod(): void {
      console.log("Inside MyNamespace.MyClass.myMethod");
    }
  }

  export interface MyInterface {
    name: string;
  }
}

// 使用命名空间中的类和接口
let instance = new MyNamespace.MyClass();
instance.myMethod();

let obj: MyNamespace.MyInterface = { name: "Example" };

导入命名空间

如果命名空间分布在不同的文件中,可以通过 语句导入:

ts
// myNamespace.ts
export namespace MyNamespace {
  export class MyClass {
    /* ... */
  }
}

// main.ts
import { MyNamespace } from "./myNamespace";
let instance = new MyNamespace.MyClass();

或者使用 语法导入整个命名空间:

ts
import * as MyNamespace from "./myNamespace";
let instance = new MyNamespace.MyClass();

嵌套命名空间

命名空间可以嵌套,形成层次结构:

ts
namespace MyNamespace {
  export namespace SubNamespace {
    export class AnotherClass {
      /* ... */
    }
  }
}

let instance = new MyNamespace.SubNamespace.AnotherClass();

全局命名空间

在某些情况下,你可能需要在全局作用域定义一个命名空间,这通常在类型定义文件中完成,用于定义全局变量或第三方库的类型:

ts
// globalNamespace.d.ts
declare global {
  namespace MyGlobalNamespace {
    export interface SomeType {
      /* ... */
    }
  }
}

// 使用时
const obj: MyGlobalNamespace.SomeType = {
  /* ... */
};

与模块的比较

TypeScript 引入了基于 import 和 export 的模块系统,它与 ES6 模块标准更接近,逐渐成为组织代码的标准方式。相比之下,命名空间更倾向于传统面向对象语言的风格,但在某些场景下,特别是为了兼容遗留代码或模拟全局命名空间时,命名空间仍然是有用的。

总的来说,命名空间提供了一种将类型组织成逻辑单元的方式,有助于维护大型代码库的整洁和可维护性。不过,在新项目或支持模块化的新代码中,直接使用模块系统可能更为推荐。

Released under the MIT License.