TypeScript 類型基礎——類型衍生

????TS的類型系統(tǒng)引入了和強類型語言一樣的繼承模式,不過在interface和type上體現(xiàn)的并不一樣。
????首先我們定義了接口A,我們基于已有的接口A“拓展”出接口B,B獲得了A所有的字段,也就是說B是A的子類型。這里我們在聲明接口時使用了extends關鍵字標明B拓展于A。
? ? 這里我們定義了類型A,我們基于已有的類型A與類型 { gender : string }合并創(chuàng)建出類型B,B同樣獲得了A的所有字段,B類型是包含了A類型所有字段的新類型,我們使用“&”符號來計算類型A合并類型{ gender : string?}的結果。
????這些有什么用?
????基于基礎設施的衍生通常能讓我們在高層獲得一致的基礎建設。比如服務端的返回值經(jīng)常出現(xiàn)code、data、msg等字段,我們在聲明每一個返回值類型接口的時候就可以以上述字段作為基礎設施,每一個服務端返回值都拓展于這個基礎設施,在大量重復的工作中屏蔽相同點往往能讓我們專注于不同的地方。與此同時更少的重復讓我們失去了失誤的可能,排除了錯字等低級錯誤帶給我們的bug。
????對于強類型語言來說,類型的繼承往往意味著可以提供多態(tài)的能力,繼承于非虛基類的子類型對象可以穩(wěn)定的傳給參數(shù)類型為基類類型的函數(shù),TS中也是如此:
????也就是說可以利用這種機制,借助函數(shù)去“收窄”參數(shù)或者返回值的類型。一個對“基礎設施”(基類數(shù)據(jù))進行操作的函數(shù)不需要關心其參數(shù)是否來自于子類,只需要將參數(shù)類型標記為基類類型就可以了;函數(shù)的返回值的消費者不關心子類細節(jié),則我們就可以將返回值標記為基類類型,卻返回子類型的數(shù)據(jù),屏蔽的越多開發(fā)過程中消耗的心智就越少。
????在設計模式的角度上去講,多態(tài)體現(xiàn)出的是不同的接口負責不同的職責,以上面的代碼為例,getName的職責屬于接口A的業(yè)務領域,那么A所屬的業(yè)務領域就只能對實現(xiàn)接口A的類型進行操作。如果現(xiàn)在有另一個函數(shù)getGender:
????getGender屬于接口B所在的領域,那么就只能以B為參數(shù),接口的隔離不僅僅是數(shù)據(jù)的隔離,也是領域的隔離。通常我們將某一種領域的通用語言以接口描述,遵循接口規(guī)則則可以參與領域業(yè)務。
????上面的知識請參考接口隔離原則ISP。
下一篇記錄一下類Class。