TypeScript 高級語法——泛型

????基于前一篇對函數(shù)的基礎(chǔ)認知我們可以更進一步了。
? ? 在官方文檔上有這樣一個例子,例子中我們在函數(shù)名后使用“<Type>”標(biāo)記該函數(shù)為泛型函數(shù),在實際使用中會根據(jù)實際使用的場景確定泛型占位標(biāo)記Type的真實值。比如在使用firstElement1時Type為參數(shù)arr的類型,所以因為[ 1,2,3?]的類型為Array<number>,則泛型占位Type的實際值為number[ ]。我們也可以顯式的指定泛型占位標(biāo)志的類型,如上例中被注掉的部分,多數(shù)時候我們都不需要顯式聲明,因為基于類型推斷就已經(jīng)能達到很好的效果。
????在firstElement2函數(shù)中出現(xiàn)了“extends”關(guān)鍵字其意義表示為:類型Type是可以適配any數(shù)組的類型,官方稱之為泛型約束,因為number數(shù)組是any數(shù)組的子集,所以將下方的firstElement1替換成firstElement2也一樣可以正常運行。
????上述泛型約束的例子只是為說明其邏輯的最簡單示例,現(xiàn)實場景中需要開發(fā)人員為泛型提供有效約束,而不是any這種泛泛的約束(和沒約束沒什么區(qū)別),有效約束是比如泛型類型中必須有名為name 的字段之類,以下為正確示例:
????在聲明泛型函數(shù)時往往應(yīng)該遵循最小泛型數(shù)量的設(shè)計:
????在上例中filter1的可讀性是完全高于filter2的,更少的泛型聲明帶給開發(fā)者的是更好的可讀性與更少的神志負擔(dān),我們可以從函數(shù)體的類型依賴中推斷出函數(shù)需要幾個泛型占位標(biāo)記(每種未在開發(fā)時確定的依賴類型算一個)。
????interface也可以增加泛型標(biāo)記,如上所示和泛型函數(shù)不同的是泛型接口必須顯式的指定類型,上例的AppleBox是一個為確定實現(xiàn)的泛型接口起別名的操作,其中的泛型實現(xiàn)Apple是另一個接口。
????介紹泛型的同時介紹一個只讀數(shù)組類型ReadonlyArray,ReadonlyArray是TS定義的一個只讀泛型數(shù)組類型,本質(zhì)是一個泛型接口,其與Array類型最大的差異是ReadonlyArray不可被修改(無法使用具有副作用的函數(shù),例如:push)。
????泛型類和泛型接口完全相同,唯一的區(qū)別是類是ES標(biāo)準(zhǔn)中的概念,打包后依然以JS代碼的形式存在,只不過屬于類型描述的部分(泛型、參數(shù)類型聲明)都消失了;而接口是TS的概念,無法轉(zhuǎn)換為JS代碼,所以泛型接口不會出現(xiàn)在打包后的代碼中。