07_命名空间

143 阅读2分钟

命名空间:在代码量较大的情况下,为了避免各种变量明明相冲突,可以将相似功能的函数、类、接口等放置到命名空间内 命名空间和模块化的区别: 命名空间:内部模块,主要用于组织代码,避免命名冲突的问题 模块:ts的外部模块的简称,侧重代码的复用,一个模块里面可能会有很多个命名空间

//1.在最外面增加一个namespace,命名空间A,里面有Animal接口
namespace A {
    interface Animal {
        name:string;
        eatA():void;
    }
//2.有了namespace,就表示是一个私有空间,外面需要使用就需要export向外暴露一下了
  
export class Dogdog implements Animal { //向外暴露一个Dogdog类,结成A空间的Animal的接口
     name:string;
     constructor(name:string){
        this.name=name;
        }
     eatA(){
         console.log(`${this.name}吃狗粮`);
        }
    }
export class Catcat implements Animal { //向外暴露一个Catcat类,结成A空间的Animal的接口
        name:string;
        constructor(name:string){
            this.name=name;
        }
        eatA(){
            console.log(`${this.name}吃猫粮`);
        }
    }
}

let dog = new A.Dogdog('阿黄'); //A空间的Dogdog实例化
dog.eatA();

let cat = new A.Catcat('小蓝'); //A空间的Dogdog实例化
cat.eatA();

下面又定义了一个命名空间B,B里面有Animal接口。但是上面命名空间A里面的Animal接口和B命名空间里面的Animal接口是不一样的。

//命名空间也可以模块化,只需要在namespace前面增加一个export即可
//和模块化的导入导出方式是一样的
export namespace B { //在最外面增加一个namespace,命名空间A,里面有Animal接口
  interface Animal {
      name:string;
      eatB():void;
  }
  //2.有了namespace,就表示是一个私有空间,外面需要使用就需要export向外暴露一下了
  export class Dogdog implements Animal {
      name:string;
      constructor(name:string){
          this.name=name;
      }
      eatB(){
          console.log(`${this.name}吃狗粮`);
      }
  }
  export class Catcat implements Animal {
      name:string;
      constructor(name:string){
          this.name=name;
      }
      eatB(){
          console.log(`${this.name}吃猫粮`);
      }
  }
}

let Bdog = new B.Dogdog('阿黄'); //上面的类使用的是B空间里面的DogDog
Bdog.eatB();

let Bcat = new B.Catcat('小蓝'); ////上面的类使用的是B空间里面的Catcat
Bcat.eatB();