本書(shū)全面介紹類(lèi)型系統(tǒng)的特性,從基本類(lèi)型開(kāi)始,一直介紹到函數(shù)類(lèi)型和子類(lèi)型、OOP、泛型編程和高階類(lèi)型(如函子和單子)。本書(shū)沒(méi)有關(guān)注這些特性背后的理論,而是通過(guò)實(shí)際應(yīng)用的方式來(lái)解釋每種特性。本書(shū)說(shuō)明了如何以及何時(shí)使用每種特性來(lái)改進(jìn)代碼。
前言
致謝
關(guān)于本書(shū)
類(lèi)型及可能的取值
常用算法
第1章 類(lèi)型簡(jiǎn)介1
1.1 為什么存在類(lèi)型2
1.1.1 0和12
1.1.2 類(lèi)型和類(lèi)型系統(tǒng)的定義3
1.2 類(lèi)型系統(tǒng)的優(yōu)點(diǎn)4
1.2.1 正確性5
1.2.2 不可變性6
1.2.3 封裝8
1.2.4 可組合性9
1.2.5 可讀性11
1.3 類(lèi)型系統(tǒng)的類(lèi)型12
1.3.1 動(dòng)態(tài)類(lèi)型和靜態(tài)類(lèi)型12
1.3.2 弱類(lèi)型與強(qiáng)類(lèi)型13
1.3.3 類(lèi)型推斷15
小結(jié)15
第2章 基本類(lèi)型17
2.1 設(shè)計(jì)不返回值的函數(shù)17
2.1.1 空類(lèi)型18
2.1.2 單元類(lèi)型20
2.1.3 習(xí)題21
2.2 布爾邏輯和短路21
2.2.1 布爾表達(dá)式22
2.2.2 短路計(jì)算22
2.2.3 習(xí)題24
2.3 數(shù)值類(lèi)型的常見(jiàn)陷阱24
2.3.1 整數(shù)類(lèi)型和溢出25
2.3.2 浮點(diǎn)類(lèi)型和圓整28
2.3.3 任意大數(shù)30
2.3.4 習(xí)題31
2.4 編碼文本31
2.4.1 拆分文本31
2.4.2 編碼32
2.4.3 編碼庫(kù)34
2.4.4 習(xí)題36
2.5 使用數(shù)組和引用構(gòu)建數(shù)據(jù)結(jié)構(gòu)36
2.5.1 固定大小數(shù)組36
2.5.2 引用37
2.5.3 高效列表38
2.5.4 二叉樹(shù)40
2.5.5 關(guān)聯(lián)數(shù)組43
2.5.6 實(shí)現(xiàn)時(shí)的權(quán)衡44
2.5.7 習(xí)題44
小結(jié)44
習(xí)題答案45
第3章 組合46
3.1 復(fù)合類(lèi)型47
3.1.1 元組47
3.1.2 賦予意義49
3.1.3 維護(hù)不變量50
3.1.4 習(xí)題53
3.2 使用類(lèi)型表達(dá)多選一53
3.2.1 枚舉53
3.2.2 可選類(lèi)型55
3.2.3 結(jié)果或錯(cuò)誤57
3.2.4 變體62
3.2.5 習(xí)題65
3.3 訪問(wèn)者模式65
3.3.1 簡(jiǎn)單實(shí)現(xiàn)66
3.3.2 使用訪問(wèn)者模式67
3.3.3 訪問(wèn)變體69
3.3.4 習(xí)題71
3.4 代數(shù)數(shù)據(jù)類(lèi)型71
3.4.1 乘積類(lèi)型71
3.4.2 和類(lèi)型72
3.4.3 習(xí)題72
小結(jié)73
習(xí)題答案74
第4章 類(lèi)型安全75
4.1 避免基本類(lèi)型偏執(zhí)來(lái)防止錯(cuò)誤解釋76
4.1.1 火星氣候探測(cè)者號(hào)77
4.1.2 基本類(lèi)型偏執(zhí)反模式79
4.1.3 習(xí)題79
4.2 實(shí)施約束80
4.2.1 使用構(gòu)造函數(shù)實(shí)施約束80
4.2.2 使用工廠實(shí)施約束81
4.2.3 習(xí)題82
4.3 添加類(lèi)型信息82
4.3.1 類(lèi)型轉(zhuǎn)換82
4.3.2 在類(lèi)型系統(tǒng)之外跟蹤類(lèi)型83
4.3.3 常見(jiàn)類(lèi)型轉(zhuǎn)換86
4.3.4 習(xí)題89
4.4 隱藏和恢復(fù)類(lèi)型信息89
4.4.1 異構(gòu)集合90
4.4.2 序列化92
4.4.3 習(xí)題95
小結(jié)96
習(xí)題答案96
第5章 函數(shù)類(lèi)型98
5.1 一個(gè)簡(jiǎn)單的策略模式99
5.1.1 函數(shù)式策略100
5.1.2 函數(shù)的類(lèi)型101
5.1.3 策略實(shí)現(xiàn)102
5.1.4 一等函數(shù)102
5.1.5 習(xí)題103
5.2 不使用switch語(yǔ)句的狀態(tài)機(jī)103
5.2.1 類(lèi)型編程小試牛刀104
5.2.2 狀態(tài)機(jī)106
5.2.3 回顧狀態(tài)機(jī)實(shí)現(xiàn)111
5.2.4 習(xí)題112
5.3 使用延遲值避免高開(kāi)銷(xiāo)的計(jì)算112
5.3.1 lambda113
5.3.2 習(xí)題115
5.4 使用map、filter和reduce115
5.4.1 map()115
5.4.2 filter()117
5.4.3 reduce()119
5.4.4 庫(kù)支持122
5.4.5 習(xí)題123
5.5 函數(shù)式編程123
小結(jié)123
習(xí)題答案124
第6章 函數(shù)類(lèi)型的高級(jí)應(yīng)用126
6.1 一個(gè)簡(jiǎn)單的裝飾器模式126
6.1.1 函數(shù)裝飾器128
6.1.2 裝飾器實(shí)現(xiàn)130
6.1.3 閉包130
6.1.4 習(xí)題131
6.2 實(shí)現(xiàn)一個(gè)計(jì)數(shù)器131
6.2.1 一個(gè)面向?qū)ο蟮挠?jì)數(shù)器132
6.2.2 函數(shù)式計(jì)數(shù)器133
6.2.3 一個(gè)可恢復(fù)的計(jì)數(shù)器134
6.2.4 回顧計(jì)數(shù)器實(shí)現(xiàn)135
6.2.5 習(xí)題135
6.3 異步執(zhí)行運(yùn)行時(shí)間長(zhǎng)的操作135
6.3.1 同步執(zhí)行136
6.3.2 異步執(zhí)行:回調(diào)136
6.3.3 異步執(zhí)行模型137
6.3.4 回顧異步函數(shù)141
6.3.5 習(xí)題141
6.4 簡(jiǎn)化異步代碼142
6.4.1 鏈接promise143
6.4.2 創(chuàng)建promise144
6.4.3 關(guān)于promise的更多信息146
6.4.4 async/await150
6.4.5 回顧整潔的異步代碼152
6.4.6 習(xí)題152
小結(jié)153
習(xí)題答案153
第7章 子類(lèi)型155
7.1 在TypeScript中區(qū)分相似的類(lèi)型156
7.1.1 結(jié)構(gòu)和名義子類(lèi)型的優(yōu)缺點(diǎn)158
7.1.2 在TypeScript中模擬名義子類(lèi)型159
7.1.3 習(xí)題160
7.2 子類(lèi)型的極端情況160
7.2.1 安全的反序列化160
7.2.2 錯(cuò)誤情況的值164
7.2.3 回顧頂層和底層類(lèi)型167
7.2.4 習(xí)題168
7.3 允許的替換168
7.3.1 子類(lèi)型與和類(lèi)型169
7.3.2 子類(lèi)型和集合171
7.3.3 子類(lèi)型和函數(shù)的返回類(lèi)型172
7.3.4 子類(lèi)型和函數(shù)實(shí)參類(lèi)型174
7.3.5 回顧可變性178
7.3.6 習(xí)題178
小結(jié)179
習(xí)題答案179
第8章 面向?qū)ο缶幊痰脑?81
8.1 使用接口定義契約182
8.2 繼承數(shù)據(jù)和行為185
8.2.1 “是一個(gè)”經(jīng)驗(yàn)準(zhǔn)則185
8.2.2 建模層次186
8.2.3 參數(shù)化表達(dá)式的行為187
8.2.4 習(xí)題188
8.3 組合數(shù)據(jù)和行為189
8.3.1 “有一個(gè)”經(jīng)驗(yàn)準(zhǔn)則189
8.3.2 復(fù)合類(lèi)190
8.3.3 實(shí)現(xiàn)適配器模式192
8.3.4 習(xí)題194
8.4 擴(kuò)展數(shù)據(jù)和行為194
8.4.1 使用組合擴(kuò)展行為195
8.4.2 使用混入擴(kuò)展行為197
8.4.3 TypeScript中的混入198
8.4.4 習(xí)題199
8.5 純粹面向?qū)ο蟠a的替代方案199
8.5.1 和類(lèi)型200
8.5.2 函數(shù)式編程202
8.5.3 泛型編程203
小結(jié)204
習(xí)題答案204
第9章 泛型數(shù)據(jù)結(jié)構(gòu)206
9.1 解耦關(guān)注點(diǎn)207
9.1.1 可重用的恒等函數(shù)208
9.1.2 可選類(lèi)型210
9.1.3 泛型類(lèi)型211
9.1.4 習(xí)題211
9.2 泛型數(shù)據(jù)布局212
9.2.1 泛型數(shù)據(jù)結(jié)構(gòu)212
9.2.2 什么是數(shù)據(jù)結(jié)構(gòu)213
9.2.3 習(xí)題214
9.3 遍歷數(shù)據(jù)結(jié)構(gòu)214
9.3.1 使用迭代器216
9.3.2 流線化迭代代碼220
9.3.3 回顧迭代器225
9.3.4 習(xí)題226
9.4 數(shù)據(jù)流226
9.4.1 處理管道227
9.4.2 習(xí)題228
小結(jié)228
習(xí)題答案229
第10章 泛型算法和迭代器232
10.1 更好的map()、filter()和reduce()233
10.1.1 map()233
10.1.2 filter()234
10.1.3 reduce()234
10.1.4 filter()/reduce()管道235
10.1.5 習(xí)題236
10.2 常用算法236
10.2.1 使用算法代替循環(huán)237
10.2.2 實(shí)現(xiàn)流暢管道237
10.2.3 習(xí)題241
10.3 約束類(lèi)型參數(shù)241
10.3.1 具有類(lèi)型約束的泛型數(shù)據(jù)結(jié)構(gòu)242
10.3.2 具有類(lèi)型約束的泛型算法243
10.3.3 習(xí)題245
10.4 高效reverse和其他使用迭代器的算法245
10.4.1 迭代器的基礎(chǔ)模塊247
10.4.2 有用的find()251
10.4.3 高效的reverse()254
10.4.4 高效地獲取元素257
10.4.5 回顧迭代器259
10.4.6 習(xí)題260
10.5 自適應(yīng)算法260
小結(jié)262
習(xí)題答案263
第11章 高階類(lèi)型及其他266
11.1 更加通用的map267
11.1.1 處理結(jié)果或傳播錯(cuò)誤270
11.1.2 混搭函數(shù)的應(yīng)用272
11.1.3 函子和高階類(lèi)型273
11.1.4 函數(shù)的函子276
11.1.5 習(xí)題277
11.2 單子277
11.2.1 結(jié)果或錯(cuò)誤277
11.2.2 map()與bind()的區(qū)別282
11.2.3 單子模式284
11.2.4 continuation單子285
11.2.5 列表單子286
11.2.6 其他單子288
11.2.7 習(xí)題288
11.3 繼續(xù)學(xué)習(xí)289
11.3.1 函數(shù)式編程289
11.3.2 泛型編程289
11.3.3 高階類(lèi)型和范疇論289
11.3.4 從屬類(lèi)型290
11.3.5 線性類(lèi)型290
小結(jié)290
習(xí)題答案291
附錄A TypeScript的安裝及本書(shū)的源代碼293
附錄B TypeScript速覽表295