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