目錄
繼承
之前在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等,大家自己去發掘想使用的工具吧。