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());

运行截图:

image-20201107230609316

可以看到在这里我定义了两个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:

image-20201108185624857

nsTest4.ts:

image-20201108185719936

nsTest999.ts:

image-20201108185800698

运行截图:

image-20201108190032685

第二种是用import

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

写法如下:

image-20201108193511534

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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TypeScript 命名空间Namespace)是一种将代码组织为逻辑分组的方式,可用于避免全局命名冲突。命名空间可以包含变量、函数、类和其他命名空间等成员,从而使得代码更加模块化和可维护。 命名空间可以在代码使用 `namespace` 关键字定义,并使用点号(`.`)来表示嵌套层级,例如: ```typescript namespace MyNamespace { export const myVar = "Hello"; export function myFunc() { console.log("World"); } export namespace InnerNamespace { export class MyClass {} } } ``` 在上述代码,我们定义了一个名为 `MyNamespace` 的命名空间,它包含了一个变量 `myVar`、一个函数 `myFunc` 和一个内嵌命名空间 `InnerNamespace`,后者包含了一个类 `MyClass`。注意到我们使用了 `export` 关键字来将这些成员暴露给外部使用。 使用命名空间的成员时,需要使用点号表达式(`.`)来访问嵌套层级的成员,例如: ```typescript console.log(MyNamespace.myVar); // 输出: "Hello" MyNamespace.myFunc(); // 输出: "World" const myObj = new MyNamespace.InnerNamespace.MyClass(); ``` 在访问嵌套层级的成员时,需要确保每个命名空间和每个命名空间的成员都已经被正确地导出(使用 `export` 关键字),否则会导致编译错误。 在使用命名空间时,也可以使用 `import` 语句将其他模块命名空间导入到当前模块,从而实现命名空间的重用和模块化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值