TypeScript徹底解讀(26課時)_9.TypeScript徹底解讀-TS中的類

9.TypeScript徹底解讀-TS中的類

建立class.ts文件,並在index.ts內引用es6

 

建立一個類,這個類在建立好後有好幾個地方都標紅了ide

這是tslint的一些驗證規則函數

一保存就會自動修復,視頻中是能夠修復的  估計我本身的電腦不必定會自動修復,這個錯誤的主要問題是屬性和方法前面要加修飾符測試

表示它是公共的方法和屬性this

常見實例並輸出eslint

輸出的結果視頻

一樣可使用繼承來封裝一些特性blog

eslint的限制,一個ts文件裏面只能定義一個類繼承

因此就須要去掉這個限制接口

建立你分類,子類繼承了父類,在裏面的構造函數內執行super方法,這樣父類的name屬性就繼承過來了,這和咱們在es6中建立的並無什麼區別,這裏只是增長了一些類型的定義

修飾符

定義一個私有的屬性 age

調用私有的屬性就報錯

在類上也訪問不到這個屬性

定義一個子類繼承父類,調用super方法,打印super.age一樣報錯,經過super關鍵字只能訪問基類的公共方法

protcted受保護

繼承該類的子類能夠訪問

protcted修飾構造函數,就不能使用父類去建立實例,不然就會報錯

可是能夠經過子類去建立實例

readonly

在類裏面能夠適應readonly修飾符設置屬性爲只讀的。設置只讀的屬性只能讀取,可是不能修改

既是公共的又是隻讀的name屬性,能夠輸出name的值

修改name的值。不能修改,由於他是隻讀的屬性

參數屬性

定義一個類A,定義了一個空的構造函數,可是tslint驗證不經過。

tslint內關閉這個選項便可。爲了測試用,通常在實際的項目開發過程當中,儘可能不要這麼去操做

由於咱們只是接收參數,並無this上設置屬性值

下面使用參數屬性,給參數加上三個修飾符中的任意一個便可。

咱們訪問這個屬性也是能夠的

屬性上加上private就不能再去訪問這個屬性的值了

由於這個屬性是私有的

加上參數修飾符,既會幫你指定這個屬性是什麼類型的,並且還會把你的這個屬性放到實例上

靜態屬性

age是一個靜態的屬性

一問你這個屬性是靜態的

 

直接訪問類上的這個屬性,是能夠訪問到的,age是類的靜態屬性,只有類自己可以使用

把age設置爲私有的private,保存的時候,tslint會建議把私有的屬性放在公有的方法後面。

因此一保存了文件,私有的屬性就被自動放到pulic方法的後面,固然這是視頻中的效果,個人機器不必定會這樣。。。

咱們再去訪問p.age就會報錯了

類自己去訪問也不行

以上就是靜態屬性

可選類屬性

22分46

name是必選的 因此這裏必須傳入name的屬性。

public sex是參數屬性

由於沒有傳值,可是sex屬性仍是存在的

存取器

至關於es6中的存值函數和取值函數,在設置 屬性值的時候調用的函數,用法和寫法和es6的沒有區別

調用存值器

這裏是由於用下劃線的eslint不容許

咱們在tslint裏面把這個關掉

調用infoStr存值器函數,就會打印出這句話同事給私有屬性_infoStr賦值

抽象類

一般被其餘類繼承,而不直接建立實例,抽象類和內部定義的抽象方法都是用abstract關鍵字

構造函數什麼也不寫,

在使用abstract構造一個抽象方法,方法須要修飾符。抽象類建立實例就會報錯。沒法建立抽象類的實例

它只能被類繼承,定義一個man類繼承people這個類

若是要實現printName這個方法就要在Man類裏面去實現這個方法,這樣就可使用man去建立實例了

abstract不只能夠標記類和方法,能夠標記類裏面的存取器

P類繼承了People,必須實現裏面的抽象屬性_name

 

同時還要實現裏面的insideName方法。抽象方法和抽象存取器都不能包含實際的代碼塊

 實例屬性

當咱們定義一個類,並建立實例後,這個實例的類型就是 它建立的類

也就是說咱們這個類既是一個值也是一個類型

建立一個類People,P2實例化People這個類,

p2的類型就是people類

也能夠明確的制定類型就是people,可是這裏是能夠省略的,會自動根據你建立實例的類去推斷出你的類型

定義一個animal的類,內部也是一個空的構造函數和People相同,p2去實例化Animal類也是沒有問題的

類、類型接口

定義接口,裏面定義type屬性,定義類去繼承這個藉口,用關鍵字 implements

 實現接口,子類必須也要定義屬性type

 實現接口的類 給type屬性前面加上 static關鍵字。就會報錯了。

static修飾了智能經過類自己去訪問。在實例上就不會有這個type屬性。接口的監測的是使用該接口定義的類建立的實例。因此實例上沒有這個type屬性,因此這裏就會報錯

因此你要保證這個類建立的實例要符合這個接口

 接口繼承類

接口繼承了類後,接口會繼承這個類的成員,可是不包括實現。也就是隻繼承成員和他的成員類型,接口還會繼承類的private和protected成員,當接口繼承的類中包含這兩個修飾符的成員時他的接口只可被這個類或者它的子類去實現

定義類A裏面定義一個受保護的屬性name

I繼承類A,裏面什麼也不實現

I裏面什麼也不實現,必須關閉tslint的選項。這裏關閉就容許裏面什麼也不定義的空接口了。

定義類B實現接口I,這裏就報錯了,I繼承了類A的屬性,可是咱們在繼承接口I的時候並無定義name屬性

在B裏面實現name屬性,仍是會報錯。這是由於peotected修飾符的特色

受保護的屬性只能在繼承這個類的的子類中去訪問,B並非繼承了這個類A,因此這裏無法使用這個name屬性

類B繼承類A再去實現接口I,這樣才能夠

在泛型中使用類類型

create函數傳入的參數是一個類,返回的是一個類建立的實例

new()表示的是調用這個類的構造函數,他的類型也就是建立實例後的類型

也能夠實行這個傳入的類型

輸出咱們建立的實例

給這個類Infos加上構造函數,就會有輸出了

能夠直接訪問age屬性是沒有問題的

相關文章
相關標籤/搜索