欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

TypeScript中的命名空间—namespace

程序员文章站 2022-04-29 09:35:14
TypeScript中的命名空间—namespace什么是命名空间?在很多语言中都有这个概念。命名空间是为了解决命名冲突。比如你在代码的不同地方,都定义了同名但是不同含义的函数、变量等,虽然不提倡这么做,但是有时候需要这么做。那怎么办呢?可以选择将同名但是不同含义的函数、变量等分别写在不同的命名空间中,就不怕有冲突报错啦!命名空间的关键字是namespacenamespace tsNamespace {​ let ownerName: string = "tsNameSpace";​...

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

可以看到在这里我定义了两个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之后,要不然会出错。原则:调用之前,必须先定义

运行结果如下:

TypeScript中的命名空间—namespace

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

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

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

如何应用写好的namespace?

第一种是用reference

在文件中开头加入 ///

注意事项三个 / 哦

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

nsTest3.ts:

TypeScript中的命名空间—namespace

nsTest4.ts:

TypeScript中的命名空间—namespace

nsTest999.ts:

TypeScript中的命名空间—namespace

运行截图:

TypeScript中的命名空间—namespace

第二种是用import

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

写法如下:

TypeScript中的命名空间—namespace

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

本文地址:https://blog.csdn.net/CoderXZ/article/details/109561600

相关标签: TypeScript