命名空间:在代码量较大的情况下,为了避免各种变量明明相冲突,可以将相似功能的函数、类、接口等放置到命名空间内 命名空间和模块化的区别: 命名空间:内部模块,主要用于组织代码,避免命名冲突的问题 模块: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();