TypeScript 是一个结构类型系统。意思就是当我们比较两个类型的时候,只关注他们的架构是否一样,而不是在乎他们的原型是否一样。
但是,当我们谈到 Class 的时候,上面的结论并不总是正确。这个取决于我们的 Class 的属性是 public,private,还是 protected。
一:当 Class 的所有属性都是 public
首先,当你不特别指定的时候,Class 的属性默认是 public 的。
如果是 2 个基于某个 class 而 new 出来的对象,我们说这两个对象的类型是否兼容,只要看这个对象的结构是否一致,而不一定要对应的 class 是否是相同的。– 但是,这点只针对于 class 的所有属性都是 public 的时候。看下面的例子:
class Animal {
name: string;
constructor(name: string) {this.name = name;}
}
class Person {
name: string;
constructor(name: string) {this.name = name;}
}
let animal: Animal = new Animal('kitty');
let person: Person = new Person('nana');
animal = person; // 这样是不会报错的,以为 animal 和 person 有相同的结构
animal = 1; // 报错,数字 number 型和 animal 结构不一样。
二:当 Class 拥有 private 或者 protect 属性时候
当 Class 拥有 private 或者 protected 的属性的时候,光是结构一样,并不能带来类型一样的结果:
class Animal {
private name: string;
constructor(name: string) {this.name = name;}
}
class Person {
name: string;
constructor(name: string) {this.name = name;}
}
let animal: Animal = new Animal('kitty');
let person: Person = new Person('nana');
animal = person; //Error, 类型不一样
这段代码,我们仅仅是使得 Animal 的 name 变为 private,并没有改变它的结构,但是 animal 和 person 已经是不同类型。当我们把 person 赋值给 animal 的时候,就会得到一个 error。
这里我们是把 Animal 的属性改为了 private,对于 protected 也是一样的结果。
三:Public, Protect, Private 的区别
1: public 的属性,可以在 instance 上访问
2: protect 的属性,不可以在 instance 上访问,但是可以在子类里 面访问
3: private 的属性,只能在本 class 内部访问
例如:
class Animal {
public category: string;
protected color: string;
private name: string;
constructor(category: string, name: string, color: string) {
this.category = category;
this.name = name;
this.color = color;
}
}
class Cat extends Animal {constructor(category: string, name: string, color: string) {super(category, name, color);
}
printInfo() {console.log(`The category of the cat is ${this.category}`); // No Error
console.log(`The color of the cat is ${this.color}`);// No Error
console.log(`The name of the cat is ${this.name}`);//Error!}
}
let animal = new Animal('animal', 'animal', 'white');
let cat = new Cat('cat', 'kitty', 'black');
animal.category = 'animal_1';//No Error. 可以在 instance 上访问 public 的属性
console.log(cat.color);//Error!不能在 insatance 上访问 protect 的属性
总结的话,我们的属性访问权限有 3 个 level:
1:可以在 instance 上访问的:public
2:可以在子类里面访问的:public 和 protected
3:只可以在 class 内部访问的:private