目录
继承
之前在ES6中没有太多的介绍继承和多态,因为理解起来还是很简单的:
class Programmer extends Person{
private hair:boolean;
constructor(firstName, lastName, hair:boolean){
super(firstName,lastName );
this.hair = hair;
}
displayName(): string {
return "changed"
}
displayOldName(){
return super.displayName()
}
}
这是对JavaScript 学习笔记(7)--TS初见中Person对象的一个继承,和ES6是一样的,在写之前忽然忘记了构造函数怎么继承了,这里贴出来就当复习一下。多态的话不再详细展开,上述代码中去除private声明的话,我们声明一个对象:
let Asen: Person = new Programmer('Asen','Wang', false);
console.log(Asen.hair);
会爆出如下错误,但如果没有添加hair属性,或者不输出hair,我们发现Asen是可以设定为Person类型的。
Error:(42, 18) TS2339: Property 'hair' does not exist on type 'Person'.
Private and Protected
这方面是在学习JS时我没有认真对待的一部分。
let Asen: Person = new Programmer('Asen','Wang', false);
console.log(Asen.hair)
上述代码会报错:
Error:(42, 18) TS2341: Property 'hair' is private and only accessible within class 'Programmer'.
这样如果我们想去调用私有属性,需要写一个公共方法。
printPrivateHair(){
console.log(this.hair);
}
这时我们可以得到私有属性中的方法,但是需要注意的是,对于子类新创建的方法,我们是没有办法传递私有属性的。
Asen.printPrivateHair();
C:\Users\...\WebstormProjects\TypeScript\TS1>node object.js
false
这就要引申出protected修饰,在很多语言中,protected修饰的值在子类中是可以直接打印出来的,但是在TS中是不允许的,它和private一样只能使用公共方法调用。那么这两着有什么区别呢?
class Person {
private readonly firstName: string;
protected lastName: string;
public age: number;
constructor(firstName: string, lastName: string, age:number) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
getFirstName(): string {
return this.firstName
}
setLastName(lastName): void{
this.lastName = lastName;
}
}
class Programmer extends Person{
public readonly hair:boolean;
constructor(firstName, lastName,age, hair:boolean){
super(firstName,lastName, age );
this.hair = hair;
}
getName(){
return `${this.lastName}' ' and ' '${this.firstName} `
}
}
由上面这个例子,在定义新的方法"getName()"的时候,使用私有属性是不能被调用的,但是保护属性是可以被调用的,这就是两者的一点不同。
同时,如果我们给Person类的构造方法添加"protected"修饰,我们是不能对Person类直接传参数的,但是可以对"programmer"传参,与上面特性其实是相同的,private则都不能传参。
枚举
在ES6中对枚举只是简单带过,这里举个例子复习一下,顺便,其实枚举也有很多用途,许多下拉框的字符串可以以枚举的数字值来表示,这其实是一个很有用的特性。
enum DayOfWeek{
Day, ofWeek, week
}
let plan: DayOfWeek = DayOfWeek.Day;
console.log(typeof plan, plan);
//0,number 0
最后是几个工具,包括直接编译运行TS文件ts-node,Webstorm好用的调试器JetBrains IDE Support等,大家自己去发掘想使用的工具吧。