Skip to main content

Namespace

从TypeScript 1.5开始,一些术语已经发生了变化。 “内部模块”现在是“命名空间”。 “外部模块”现在简称为“模块”。

命名空间

在TypeScript中,命名空间用于跨多个文件组织和共享代码。命名空间允许将相关功能分组到一个单元中并防止命名冲突,提供了一种逻辑上的分组方式,用于将相关的功能、类型和变量封装在一起。如果希望接口、类、函数等在命名空间之外可见,需要将它们使用export关键字导出,否则将无法再外界使用:

namespace MyNamespace {
export function doSomething () {
console.log('do something');
}

interface MyInterface {
name: string;
age: number
}

export class MyClass {
public name:string;
public age:number;

constructor(options: MyInterface) {
this.name = options.name
this.age = options.age
}
}
}

MyNamespace.doSomething()
const mc = new MyNamespace.MyClass({
name: 'Tim',
age: 20
})
// Namespace 'MyNamespace' has no exported member 'MyInterface'.
let objs:MyNamespace.MyInterface;

跨文件命名空间

随着应用程序的增长,通常希望将代码拆分到多个文件中,以使其更易于维护。将验证命名空间拆分为多个文件,尽管这些文件是独立的,但它们都可以贡献于相同的命名空间,并且可以像它们全部定义在一个地方一样使用。 由于文件之间存在依赖关系,因此我们将添加引用标签来告诉编译器文件之间的关系:

// func.ts
namespace MyNamespace {
export function doSomething() {
console.log('do something');
}
}

// class.ts
namespace MyNamespace {
interface MyInterface {
name: string;
age: number
}
export class MyClass {
public name:string;
public age:number;
constructor(options: MyInterface) {
this.name = options.name
this.age = options.age
}
}
}

// index.ts
/// <reference path="class.ts" />
/// <reference path="func.ts" />

MyNamespace.doSomething()
const mc = new MyNamespace.MyClass({
name: 'Tim',
age: 20
})
// Namespace 'MyNamespace' has no exported member 'MyInterface'.
let objs:MyNamespace.MyInterface;

嵌套命名空间

嵌套命名空间允许在一个命名空间内部定义另一个命名空间,来组织和层次化你的代码。

namespace Shapes {
export namespace Polygons {
export class Circle {}
export class Square {}
}
}

别名

简化命名空间使用的另一种方法是使用import q = x.y.z为常用对象创建较短的名称。不要与用于加载模块的import x = require("name")语法混淆,该语法只是为指定符号创建一个别名。您可以将这些类型的导入(通常称为别名)用于任何类型的标识符,包括从模块导入创建的对象。

import polygons = Shapes.Polygons
// equal to new Shapes.Polygons.Circle()
let sq = new polygons.Circle()

命名空间导入导出

  • 使用<reference path="xxx.ts" />
// namespacet.ts
namespace MyNamespace {
export function doSomething() {
console.log('Doing something...');
}
}

// index.ts
<reference path="namespace.ts" />
  • 模块化导入导出方式
// namespacet.ts
export namespace MyNamespace {
export function doSomething() {
console.log('Doing something...');
}
}

// index.ts
import { MyNamespace } from './namespace.ts'

MyNamespace.doSomething()

环境命名空间

环境命名空间可以用来描述全局命名空间中的类型和接口,允许你在不引入外部模块的情况下,为已存在的全局对象定义类型。使用环境命名空间时,需要使用declare namespace语法来声明命名空间,并在其中定义类型和接口:

declare namespace MyNamespace {
interface MyInterface {
name: string;
age: number;
}

function myFunction(): void;
}

// 使用环境命名空间中定义的类型和函数
const obj: MyNamespace.MyInterface = {
name: "Alice",
age: 25,
};

MyNamespace.myFunction();

环境命名空间中的声明不会创建真正的JavaScript对象,它们仅用于类型检查和编译时静态分析。因此,在使用环境命名空间时,需要确保全局对象在运行时的环境中存在。