前言
小伙伴们大家好。上篇文章中我们学习了TypeScript中的模块以及模块的几种导入导出方式,通过学习我们了解到模块可以很好的避免不同文件间变量函数等重名的问题(当然了模块的好处也不仅仅只有这一点)。前面说到模块可以很好的解决不同文件间的重名问题,那么同一个文件中有时候也是避免不了重名问题,那又该如何解决呢?不知道有没有小伙伴记得,在上篇文章中我们提到“在TypeScript1.5版本之前有两种模块:内部模块和外部模块,而在1.5以后内部模块更名为命名空间,外部模块则更名为模块”。而这个命名空间就可以很好的解决同一个文件中的重名问题,或者干脆说命名空间就是可以解决重名问题不管是同一文件还是不同的文件,只要不是同一个命名空间即可。下面我们就来看下命名空间又是个啥?
命名空间
前面已经提到TypeScript中的命名空间是由原来的内部模块更名而来,它的最明确的目的就是为了解决重名问题。了解了命名空间的作用,下面我们再来看下,命名空间是如何使用,它都有哪些t特点:
- 命名空间是通过关键字 **“namespace”**加 名称 来定义的,比如:namespace Shaps
- 同一个文件中可以定义多个相同或不同的命名空间
- 同一个命名空间也可以分割在不同的文件中定义,只要名称相同都认为它们是同一个命名空间
- 如果想在一个文件中引用其它文件中的命名空间时,需要通过三斜杠加reference标签的形式引入。如:/// < reference path=“文件路径” />
- 如果想在命名空间以外使用命名空间中的内容(变量、函数、类、接口等)时,被使用的内容必须要借助export导出,否则无法使用,也就是说只有通过export导出的内容才可以在命名空间外访问
- 访问同一个命名空间中的变量、函数、类名等内容时可以直接访问
- 如果访问不同命名空间中的变量、函数、类名等内容时,除了这些内容要通过export导出外,还需通过 命名空间.xxx 的形式进行访问
- 命名空间可以层层嵌套,就是说一个命名空间中可以包含其他命名空间,访问时同样也是用命名空间.命名空间.xxx 的形式进行访问,内层的命名空间也需要被export
// 定义一个命名空间
// shape.ts 同一个文件可以定义多个命名空间
namespace MyShapes{
export let shapeName:string;
export interface IShape{
}
export class Shape{
}
}
namespace YourShapes{
//被外面访问的内容需要export导出
export class Circle extends MyShapes.Shape{
}
}
// 通过三斜杠加reference标签的形式引入其他文件中的命名空间
/// <reference path="shape.ts" />
// circle.ts 同一个命名空间可以定义在不同的文件中
namespace MyShapes{
shapeName = "circleShape" //相同命名空间中的内容可以直接访问
// 继承YourShapes命名空间中的Circle类并实现MyShapes命名空间中的IShape接口
export class MyCircle extends YourShapes.Circle implements IShape{
}
}
//嵌套命名空间
namespace MyShapes {
export namespace YourShapes{
export class Shape{
}
}
}
let shape = new MyShapes.YourShapes.Shape();
模块与命名空间
到此我们既学习了TypeScript中的模块又学了的命名空间。我们知道它们它们都可以很好的解决重名的问题。那么模块和命名空间有什么异同,什么情况下该使用模块,什么情况下又该使用命名空间?下面是我们个人的一点点看法和梳理(有不对的地方欢迎小伙伴们及时指正)
- 命名空间与模块的异同:
- 对于模块来说一个文件就是一个模块;而对于命名空间来说一个文件中可以定义多个相同或不同的命名空间,同一个命名空间也可以分割定义在不同的文件中。
- 模块时通过import和export关键字对内容进行导入导出的;而命名空间不用导出,命名空间中的内容通过export关键字导出,而使用命名空间是通过reference标签的形式导入。
- 命名空间和模块的使用场景:
- 个人认为:如果是为了避免同一个文件中的重名问题,那么可以使用命名空间
- 如果为了避免多文件之间的重名问题可以使用模块
- 另外如果一个文件比较简单那就没必要使用命名空间,直接使用模块即可;除非文件的内容很多很复杂,这个时候可以考虑使用命名空间,具体要视情况而定。
- 如果一个文件中只定义了命名空间,并且命名空间也是通过export导出的,那么这种情况就没必要使用命名空间,而是直接改写成模块即可
如下这种情况就是一种不必要的命名空间
export namespace MyShapes{
export class Shapes{
}
export interface IShapes{
}
}
// 不必要的命名空间,完全可以改成模块
export class Shapes{
}
export interface IShapes{
}
总结
本文我们又又又学到了一个新的知识点 - 命名空间;个人认为在一般的日常开发中命名空间的用处并不大,使用模块完全可以满足我们的开发需求,除非需要封装一些类库之类的可能会用到命名空间。虽然用处不大但是知识点我们还是要掌握的,本文我们了解了命名空间的用途和用法,最后还对命名空间和模块进行了分析和整理。
本次的分享就到这里的,喜欢的小伙伴欢迎点赞留言加关注哦!