TypeScript中的命名空间—namespace

TypeScript中的命名空间—namespace

什么是命名空间?在很多语言中都有这个概念。

命名空间是为了解决命名冲突。比如你在代码的不同地方,都定义了同名但是不同含义的函数、变量等,虽然不提倡这么做,但是有时候需要这么做。那怎么办呢?可以选择将同名但是不同含义的函数、变量等分别写在不同的命名空间中,就不怕有冲突报错啦!

命名空间的关键字是namespace

namespace tsNamespace {

let ownerName: string = "tsNameSpace";

export function sayHello(name: string) {

console.log(ownerName, "Hello,", name);

}

}

上面就是一个简单的namespace的定义。

要想访问namespace中的变量或者方法,那么就要在方法或者变量的前面加上export,这样你才能从namespace外部访问方法和变量。

基本用法

请看下面的栗子:

nsTest.ts文件内容如下:

namespace tsNamespace {

let ownerName: string = "tsNameSpace";

export function sayHello(name: string) {

console.log(ownerName, "Hello,", name);

}

}

namespace tsNamespace2 {

let ownerName: string = "tsNamespace2"

export function sayHello(name: string) {

console.log(ownerName, "Hello,", name);

}

export interface UserInfo {

name: string;

age: number;

}

export namespace tsNamespace22 {

export const MAX: number = 1000;

export class Person {

private _name: string = "aaa";

private _sex: string = "未知";

getName(): string {

return this._name;

}

getSex(): string {

return this._sex;

}

}

}

}

tsNamespace.sayHello("Andy");

tsNamespace2.sayHello("Andy");

let userInfo: tsNamespace2.UserInfo = { name: "andy", age: 25 };

console.log(userInfo);

let tsNameSpace22 = tsNamespace2.tsNamespace22;

console.log(tsNameSpace22.MAX);

let Person = tsNamespace2.tsNamespace22.Person;

let person = new Person();

console.log(person);

console.log(person.getName());

console.log(person.getSex());

运行截图:

TypeScript中的命名空间—namespace_第1张图片

可以看到在这里我定义了两个namespace,他们之间有相同的方法,但是互不影响,如果没有放在不同的namespace中,会报错。这也就印证了namespace的作用。

还有就是namespace的用法,在tsNamespace2中,namespace可以包含变量、函数、接口、类等等一系列东西,并且namespace还可以嵌套定义,namespace中还可以定义namespace。那么访问其中的变量、函数、接口等的方法是,在他们前面都加上export(表示可以导出,外部可用),然后通过namespace调用.运算符即可调用。

namespace的定义可以分多文件

当应用变得越来越大时,我们需要将代码分离到不同的文件中以便于维护。请看下面的栗子:

nsTest2.ts内容如下:

namespace tsNamespace2 {

export function sayHi(name: string) {

console.log("Hi,", name);

}

export namespace tsNamespace100 {

export interface UserInfo {

nickName: string;

age: number;

sex: string;

}

}

}

结合上面的代码,可以看到在nsTest.ts中定义了tsNamespace2,在nsTest2.ts中也定义了tsNamespace2。

在nsTest.ts中追加以下代码:

tsNamespace2.sayHi("Leo");

import tsNamespace100 = tsNamespace2.tsNamespace100;

let user: tsNamespace100.UserInfo = { nickName: "天下无双", age: 12, sex: "男" };

console.log(user);

然后用tsc编译,输入

tsc --outfile test.js nsTest2.ts nsTest.ts

注意这里 nsTest2.ts nsTest.ts这是一个编译顺序列表。

要为了确保调用sayHi是在定义tsNamespace2的sayHi之后,要不然会出错。原则:调用之前,必须先定义

运行结果如下:

image-20201107234506841

可以知道,namespace的定义是可以分多文件的。

注意一点:定义namespace时,其中的方法都必须实现。

在声明(declare)namespace时,又是不能实现具体的方法。

如何应用写好的namespace?

第一种是用reference

在文件中开头加入 ///

注意事项三个 / 哦

通过reference进行导入相当于xxx.ts文件内的命名空间和当前文件进行了合并。

nsTest3.ts:

TypeScript中的命名空间—namespace_第2张图片

nsTest4.ts:

TypeScript中的命名空间—namespace_第3张图片

nsTest999.ts:

TypeScript中的命名空间—namespace_第4张图片

运行截图:

image-20201108190032685

第二种是用import

如果命名空间是用export导出的, 那么使用的时候就不可以用/// 了, 要用import导入。

写法如下:

TypeScript中的命名空间—namespace_第5张图片

如有错误,还请提出。一起学习,共同成长。

你可能感兴趣的:(TypeScript)