本書全面介紹類型系統(tǒng)的特性,從基本類型開始,一直介紹到函數(shù)類型和子類型、OOP、泛型編程和高階類型(如函子和單子)。本書沒(méi)有關(guān)注這些特性背后的理論,而是通過(guò)實(shí)際應(yīng)用的方式來(lái)解釋每種特性。本書說(shuō)明了如何以及何時(shí)使用每種特性來(lái)改進(jìn)代碼。
前言
致謝
關(guān)于本書
類型及可能的取值
常用算法
第1章 類型簡(jiǎn)介1
1.1 為什么存在類型2
1.1.1 0和12
1.1.2 類型和類型系統(tǒng)的定義3
1.2 類型系統(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 類型系統(tǒng)的類型12
1.3.1 動(dòng)態(tài)類型和靜態(tài)類型12
1.3.2 弱類型與強(qiáng)類型13
1.3.3 類型推斷15
小結(jié)15
第2章 基本類型17
2.1 設(shè)計(jì)不返回值的函數(shù)17
2.1.1 空類型18
2.1.2 單元類型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ù)值類型的常見陷阱24
2.3.1 整數(shù)類型和溢出25
2.3.2 浮點(diǎn)類型和圓整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 二叉樹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ù)合類型47
3.1.1 元組47
3.1.2 賦予意義49
3.1.3 維護(hù)不變量50
3.1.4 習(xí)題53
3.2 使用類型表達(dá)多選一53
3.2.1 枚舉53
3.2.2 可選類型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ù)類型71
3.4.1 乘積類型71
3.4.2 和類型72
3.4.3 習(xí)題72
小結(jié)73
習(xí)題答案74
第4章 類型安全75
4.1 避免基本類型偏執(zhí)來(lái)防止錯(cuò)誤解釋76
4.1.1 火星氣候探測(cè)者號(hào)77
4.1.2 基本類型偏執(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 添加類型信息82
4.3.1 類型轉(zhuǎn)換82
4.3.2 在類型系統(tǒng)之外跟蹤類型83
4.3.3 常見類型轉(zhuǎn)換86
4.3.4 習(xí)題89
4.4 隱藏和恢復(fù)類型信息89
4.4.1 異構(gòu)集合90
4.4.2 序列化92
4.4.3 習(xí)題95
小結(jié)96
習(xí)題答案96
第5章 函數(shù)類型98
5.1 一個(gè)簡(jiǎn)單的策略模式99
5.1.1 函數(shù)式策略100
5.1.2 函數(shù)的類型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 類型編程小試牛刀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 使用延遲值避免高開銷的計(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ù)類型的高級(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章 子類型155
7.1 在TypeScript中區(qū)分相似的類型156
7.1.1 結(jié)構(gòu)和名義子類型的優(yōu)缺點(diǎn)158
7.1.2 在TypeScript中模擬名義子類型159
7.1.3 習(xí)題160
7.2 子類型的極端情況160
7.2.1 安全的反序列化160
7.2.2 錯(cuò)誤情況的值164
7.2.3 回顧頂層和底層類型167
7.2.4 習(xí)題168
7.3 允許的替換168
7.3.1 子類型與和類型169
7.3.2 子類型和集合171
7.3.3 子類型和函數(shù)的返回類型172
7.3.4 子類型和函數(shù)實(shí)參類型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ù)合類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 和類型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 可選類型210
9.1.3 泛型類型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 約束類型參數(shù)241
10.3.1 具有類型約束的泛型數(shù)據(jù)結(jié)構(gòu)242
10.3.2 具有類型約束的泛型算法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章 高階類型及其他266
11.1 更加通用的map267
11.1.1 處理結(jié)果或傳播錯(cuò)誤270
11.1.2 混搭函數(shù)的應(yīng)用272
11.1.3 函子和高階類型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 高階類型和范疇論289
11.3.4 從屬類型290
11.3.5 線性類型290
小結(jié)290
習(xí)題答案291
附錄A TypeScript的安裝及本書的源代碼293
附錄B TypeScript速覽表295