📜  TypeScript-命名空间(1)

📅  最后修改于: 2023-12-03 14:48:05.669000             🧑  作者: Mango

TypeScript 命名空间

TypeScript 命名空间(namespace)是一种将有关联的代码、类、接口、函数和变量组合在一起的方式。命名空间可以避免全局命名冲突和“命名烦恼”的问题,同时也使得代码更易于维护和理解。

定义命名空间

在 TypeScript 中,我们可以通过 namespace 关键字来定义一个命名空间。例如:

namespace MyNamespace {
  export const PI = 3.14;

  export function calculateCircumference(diameter: number) {
    return diameter * PI;
  }

  export class Circle {
    constructor(private diameter: number) {}

    get circumference(): number {
      return calculateCircumference(this.diameter);
    }
  }
}

上面的代码中,我们定义了一个名为 MyNamespace 的命名空间,它包含了一个常量 PI、一个函数 calculateCircumference 和一个类 Circle。注意,在命名空间中,所有的成员默认都是私有的,需要使用 export 关键字将其公开。

引用命名空间

要在其他文件中使用命名空间中的成员,我们需要使用 ///<reference path="path/to/filename.ts"/> 指令来引用。

例如,假设我们将上面的命名空间保存在了 myNamespace.ts 文件中,我们可以这样引用:

///<reference path="./path/to/myNamespace.ts"/>

const circle = new MyNamespace.Circle(10);
console.log(circle.circumference); // 31.4

在上面的代码中,我们引用了 myNamespace.ts 文件,并且成功地创建了一个 MyNamespace.Circle 类的实例,并计算了它的周长。

导出和导入命名空间

除了使用 ///<reference> 指令来引用命名空间,我们还可以将一个命名空间导出,并在其他文件中导入。

例如,我们可以将上面的 myNamespace.ts 文件改成这样:

export namespace MyNamespace {
  export const PI = 3.14;

  export function calculateCircumference(diameter: number) {
    return diameter * PI;
  }

  export class Circle {
    constructor(private diameter: number) {}

    get circumference(): number {
      return calculateCircumference(this.diameter);
    }
  }
}

注意,我们在命名空间前加了 export 关键字,这样它就可以被其他文件导入了。然后,我们可以在其他文件中这样导入命名空间:

import { MyNamespace } from "./path/to/myNamespace";

const circle = new MyNamespace.Circle(10);
console.log(circle.circumference); // 31.4

在上面的代码中,我们使用 import 关键字将 myNamespace.ts 文件中的 MyNamespace 命名空间导入。这样,我们就可以直接使用 MyNamespace 中的成员了。

最后,需要注意的是,命名空间可以嵌套,可以在一个命名空间中包含另一个命名空间。这样做可以更好地组织代码,并避免命名冲突。例如:

namespace MyNamespace {
  export namespace Geometry {
    export const PI = 3.14;

    export function calculateCircumference(diameter: number) {
      return diameter * PI;
    }

    export class Circle {
      constructor(private diameter: number) {}

      get circumference(): number {
        return calculateCircumference(this.diameter);
      }
    }
  }
}

在上面的代码中,我们在 MyNamespace 中定义了一个 Geometry 命名空间,将与几何学相关的代码放在这个命名空间中。这样,我们就可以更好地组织代码了。