TypeScript 類型基礎(chǔ)——復(fù)雜類型

聯(lián)合類型
????TypeScript中的類型系統(tǒng)不僅讓我們能為字段聲明某一種類型,還可以聲明為多種類型的聯(lián)合。
????最基本的聯(lián)合類型聲明入上所示,和普通的字段聲明一致類型描述在字段名冒號(hào)后,只不過多個(gè)獨(dú)立類型之間用豎線隔開,得到的效果是字段a不僅僅可以被賦予string類型的值還可以被賦予數(shù)字型、布爾型的值,各個(gè)類型無法同時(shí)生效(因?yàn)樽侄我淮沃荒鼙毁x予一個(gè)類型的值)體現(xiàn)為或的關(guān)系。
????這有什么用?前端編程一直以來都是js的天下,作為一種弱類型語言大多數(shù)工程師很喜歡將類型判斷放在運(yùn)行時(shí),我們會(huì)給一個(gè)業(yè)務(wù)處理函數(shù)傳入各種各樣的東西,在處理函數(shù)內(nèi)部辨別參數(shù)類型執(zhí)行不同的邏輯,通常我們對(duì)頁面層提供給js邏輯的數(shù)據(jù)的態(tài)度是寬松的,我們需要“接口適配器”「1」來規(guī)范業(yè)務(wù)邏輯收到的數(shù)據(jù)模型,聯(lián)合類型能在接口適配器發(fā)揮出良好的作用(接收一個(gè)靈活類型的參數(shù)返回一個(gè)固定類型的數(shù)據(jù)模型),這樣既兼顧了js靈活的語言風(fēng)格又對(duì)業(yè)務(wù)側(cè)提供了健壯的類型檢查,沒有比這更好的事情了。
????簡單類型可以聯(lián)合,復(fù)雜類型也是一樣的:
? ? 這里user同時(shí)獲得了兩種類型,但是兩種類型同一時(shí)間只能有一個(gè)生效,也就是說賦給user的值要么是A類型要么是B類型。
? ?type同interface一樣也可以如上使用:
? ? 同時(shí)type可以用來表示某種常用聯(lián)合類型的縮寫:
????這樣myType作為某個(gè)前端自有領(lǐng)域的通用語言再合適不過了,省去了冗長的類型編寫帶來的風(fēng)險(xiǎn)和多次重復(fù)的類型聲明導(dǎo)致的維護(hù)成本增加。
通過索引訪問
????JS對(duì)象有種神奇的特征,我們除了可以使用a.b訪問對(duì)象a種的b字段還可以使用a['b']訪問a種的b字段,TS也為這種訪問方式設(shè)計(jì)了響應(yīng)的類型系統(tǒng)。
????上面的例子給我們展示了通過索引的方式聲明對(duì)象的方法,Index接口中規(guī)定索引只能是數(shù)字型或者字符型中的一種,并且通過索引訪問到的字段返回值都是string,這里要說一個(gè)js的隱含機(jī)制,當(dāng)使用非數(shù)字作為索引去訪問對(duì)象時(shí)其實(shí)會(huì)將數(shù)字隱式的轉(zhuǎn)化為字符串再去訪問對(duì)象,也就是說我們所寫的所有類型的索引訪問描述都要能與其中的字符串索引兼容:
????同理基于索引的訪問機(jī)制也要可以和直接指定字段的訪問兼容:
????這個(gè)例子中我們將通過索引訪問的方式返回值都標(biāo)記為字符型,所以通過字段名直接訪問也應(yīng)該拿到和索引取值一樣的結(jié)果,也就是說通過字段名直接訪問我們獲得的也是字符型,age卻將自己描述為數(shù)值型,這樣就產(chǎn)生了異常。
下一篇記錄一下類型拓展。