TypeScript 高級語法——Class(三)

????和interface一樣,類也有泛型機(jī)制,寫法同泛型接口。泛型無法用于靜態(tài)字段、靜態(tài)類,因?yàn)殪o態(tài)資源在類定義時就會被確定下來而不是在實(shí)例化時。
? ? 面向?qū)ο蟮木幊讨幸欢〞嬖诙鄳B(tài)的概念,引用TS官方的例子,這個例子中的“this is Type”作為基礎(chǔ)類型守衛(wèi)存在。以isFile為例this is FileRep守衛(wèi)標(biāo)記了這個函數(shù)中的this為FileRep,以此為前提t(yī)his instanceof FileRep才沒有報(bào)錯。這種機(jī)制讓TS良好的在多態(tài)的環(huán)境下運(yùn)行(這個例子中FileRep、Directory、Networked都是FileSystemObject的子類)。
????在TS中類、方法、字段可以是抽象的,如上例中抽象方法getName是不可以提供具體實(shí)現(xiàn)細(xì)節(jié)的,也就是說他只有函數(shù)簽名;因?yàn)槌橄蠓椒╣etName是類Base內(nèi)的函數(shù)成員所以類Base也必須是抽象的。
????在這個抽象類Base中存在著有具體實(shí)現(xiàn)的printName方法,也就是說抽象類可以類比為具有一部分具體實(shí)現(xiàn)的接口(interface),并且不同于普通的類,抽象類與接口相同不會被轉(zhuǎn)換成JS代碼。從完整性角度來看抽象類缺乏完整的具體實(shí)現(xiàn)所以不可被實(shí)例化、從無法編譯為JS代碼來看抽象類是缺乏運(yùn)行時體現(xiàn)的所以無法被實(shí)例化。
????繼承抽象類的類必須實(shí)現(xiàn)抽象類的抽象部分,上例中Derived為抽象方法getName提供了具體實(shí)現(xiàn)。
? ? 在TS的類型系統(tǒng)中,不同類型之間是可以單向賦值的,前提是被賦值的一方一定是賦值方的子集(Employee類包含所有Person類的組成部分)。
????上例是一個極端的例子fn函數(shù)可以接受任何對象,因?yàn)镋mpty是空對象(是任何對象的子集);