在代码量较大的情况下,为了避免各种变量命名冲突,可以将相似功能的函数、类、接口等放到命名空间中。
命名空间将代码用关键字namespace
包裹起来,只对外通过export
暴露需要在外部访问的对象.
创建两个命名空间:
namespace A{
interface Animal{
name:string;
}
export class Dog implements Animal{
name: string;
constructor(n:string){
this.name = n
}
eat():void{
console.log(`${
this.name} 吃肉`);
}
}
}
namespace B{
interface Animal{
name:string;
}
export class Dog implements Animal{
name: string;
constructor(n:string){
this.name = n
}
eat():void{
console.log(`${
this.name} 吃骨头`);
}
}
}
let d = new A.Dog('旺财')
d.eat() //旺财 吃肉
let d2 = new B.Dog('旺财')
d2.eat() //旺财 吃骨头
接下来把命名空间A、B 封装成模块:
modules/Animal.ts
export namespace A{
interface Animal{
name:string;
}
export class Dog implements Animal{
//...
}
}
export namespace B{
interface Animal{
name:string;
}
export class Dog implements Animal{
//...
}
}
index.ts
import {
A, B } from './modules/Animal'
let d = new A.Dog('旺财')
d.eat() //旺财 吃肉
let d2 = new B.Dog('旺财')
d2.eat() //旺财 吃骨头
命名空间和模块的区别
- 命名空间:内部模块,用来组织代码,避免命名冲突。
- 模块:ts外部模块的简称,侧重代码的复用,一个模块里可能有多个命名空间。