TypeScript是一個開源的、跨平臺且?guī)в蓄愋拖到y(tǒng)的avaScript超集,可以編譯為純JavaScript,然后運行在任意瀏覽器和其他環(huán)境中,使開發(fā)者可以使用一些未來JavaScript標準(ECMAScript 6和7)中的特性。TypeScript為JavaScript添加了可選的靜態(tài)類型、類和模塊,可使大型JavaScript應(yīng)用使用更好的工具,并保持更清晰的結(jié)構(gòu)。
本書系統(tǒng)化介紹TypeScript程序設(shè)計,包括四大部分。第壹篇“初識TypeScript”介紹TypeScript與JavaScript的關(guān)系以及快速開始編寫第一個TypeScript程序,第二篇“ TypeScript語言概覽”介紹TypeScript語言基礎(chǔ)、迭代器與生成器、裝飾器、命名空間、模塊等。第三篇“TypeScript類型系統(tǒng)”介紹TypeScript類型,如面量、枚舉、非Nullable、非Nullable等,還介紹了更多高級類型,如聯(lián)合、交叉、索引、映射對象、泛型、類類型、接口、類型別名、多態(tài)的this、有條件類型、類型查詢、類型斷言等,*后介紹類型更深入內(nèi)容,如類型聲明合并、類型推論、類型兼容性、外部類型聲明、編寫聲明文件等。第四篇“TypeScript應(yīng)用”通過綜合案例介紹TypeScript的配置管理、開發(fā)技巧等。
前言
第一篇 初識TypeScript
第1章 TypeScript簡介 2
1.1 什么是TypeScript 2
1.1.1 始于JavaScript,終于JavaScript 3
1.1.2 可選的靜態(tài)類型 4
1.1.3 開放與跨平臺 4
1.2 為什么要使用TypeScript 5
1.2.1 易于發(fā)現(xiàn)代碼中的錯誤 5
1.2.2 提高生產(chǎn)力 6
1.2.3 支持JavaScript的最新特性 7
1.3 成功案例 8
1.3.1 Visual Studio Code 8
1.3.2 Angular 9
第2章 快速開始 10
2.1 在線編寫并運行TypeScript 10
2.1.1 Hello World! 11
2.1.2 擴展功能:選擇TypeScript版本 12
2.1.3 擴展功能:TypeScript配置項 12
2.2 本地編寫并運行TypeScript 13
2.2.1 選擇代碼編輯器 13
2.2.2 安裝Visual Studio Code 15
2.2.3 安裝TypeScript 15
2.2.4 創(chuàng)建文件 16
2.2.5 編譯程序 17
2.2.6 運行程序 18
2.2.7 可選步驟:設(shè)置默認構(gòu)建任務(wù) 18
第二篇 TypeScript語言概覽
第3章 TypeScript語言基礎(chǔ) 22
3.1 變量 22
3.1.1 變量名 23
3.1.2 變量聲明 23
3.2 注釋 24
3.2.1 單行注釋與多行注釋 25
3.2.2 區(qū)域注釋 25
3.3 數(shù)據(jù)類型 26
3.3.1 Undefined 27
3.3.2 Null 27
3.3.3 Boolean 27
3.3.4 String 27
3.3.5 Number 28
3.3.6 Symbol 28
3.3.7 Object 29
3.4 字面量 29
3.4.1 Null字面量 30
3.4.2 Boolean字面量 30
3.4.3 Number字面量 30
3.4.4 字符串字面量 30
3.4.5 模板字面量 30
3.5 對象 31
3.5.1 對象字面量 31
3.5.2 原型對象 32
3.6 數(shù)組 34
3.6.1 數(shù)組字面量 34
3.6.2 數(shù)組中的元素 34
3.7 函數(shù) 34
3.7.1 函數(shù)聲明 34
3.7.2 函數(shù)表達式 35
3.7.3 箭頭函數(shù) 36
第4章 TypeScript語言進階 37
4.1 BigInt 37
4.1.1 創(chuàng)建BigInt 38
4.1.2 BigInt與Number 38
4.2 展開運算符 39
4.2.1 展開數(shù)組字面量 39
4.2.2 展開對象字面量 39
4.2.3 展開函數(shù)參數(shù) 39
4.3 解構(gòu) 40
4.3.1 數(shù)組解構(gòu) 40
4.3.2 對象解構(gòu) 40
4.4 可選鏈運算符 40
4.4.1 基礎(chǔ)語法 41
4.4.2 短路求值 41
4.5 空值合并運算符 42
第三篇 TypeScript類型系統(tǒng)
第5章 TypeScript類型基礎(chǔ) 44
5.1 類型注解 44
5.2 類型檢查 45
5.2.1 非嚴格類型檢查 45
5.2.2 嚴格類型檢查 45
5.3 原始類型 46
5.3.1 boolean 46
5.3.2 string 47
5.3.3 number 47
5.3.4 bigint 47
5.3.5 symbol與unique symbol 47
5.3.6 Nullable 50
5.3.7 void 53
5.4 枚舉類型 54
5.4.1 數(shù)值型枚舉 55
5.4.2 字符串枚舉 56
5.4.3 異構(gòu)型枚舉 57
5.4.4 枚舉成員映射 58
5.4.5 常量枚舉成員與計算枚舉成員 58
5.4.6 聯(lián)合枚舉類型 62
5.4.7 const枚舉類型 65
5.5 字面量類型 66
5.5.1 boolean字面量類型 66
5.5.2 string字面量類型 67
5.5.3 數(shù)字字面量類型 67
5.5.4 枚舉成員字面量類型 68
5.6 單元類型 68
5.7 頂端類型 69
5.7.1 any 69
5.7.2 unknown 71
5.7.3 小結(jié) 73
5.8 尾端類型 74
5.8.1 never 74
5.8.2 應(yīng)用場景 75
5.9 數(shù)組類型 76
5.9.1 數(shù)組類型定義 76
5.9.2 數(shù)組元素類型 78
5.9.3 只讀數(shù)組 79
5.10 元組類型 80
5.10.1 元組的定義 80
5.10.2 只讀元組 81
5.10.3 訪問元組中的元素 82
5.10.4 元組類型中的可選元素 83
5.10.5 元組類型中的剩余元素 83
5.10.6 元組的長度 84
5.10.7 元組類型與數(shù)組類型的兼容性 85
5.11 對象類型 85
5.11.1 Object 86
5.11.2 object 89
5.11.3 對象類型字面量 91
5.11.4 弱類型 97
5.11.5 多余屬性 97
5.12 函數(shù)類型 102
5.12.1 常規(guī)參數(shù)類型 102
5.12.2 可選參數(shù)類型 102
5.12.3 默認參數(shù)類型 104
5.12.4 剩余參數(shù)類型 105
5.12.5 解構(gòu)參數(shù)類型 106
5.12.6 返回值類型 106
5.12.7 函數(shù)類型字面量 108
5.12.8 調(diào)用簽名 109
5.12.9 構(gòu)造函數(shù)類型字面量 110
5.12.10 構(gòu)造簽名 111
5.12.11 調(diào)用簽名與構(gòu)造簽名 111
5.12.12 重載函數(shù) 112
5.12.13 函數(shù)中this值的類型 118
5.13 接口 119
5.13.1 接口聲明 119
5.13.2 屬性簽名 120
5.13.3 調(diào)用簽名 120
5.13.4 構(gòu)造簽名 121
5.13.5 方法簽名 121
5.13.6 索引簽名 122
5.13.7 可選屬性與方法 125
5.13.8 只讀屬性與方法 126
5.13.9 接口的繼承 127
5.14 類型別名 129
5.14.1 類型別名聲明 129
5.14.2 遞歸的類型別名 130
5.14.3 類型別名與接口 132
5.15 類 133
5.15.1 類的定義 134
5.15.2 成員變量 135
5.15.3 成員函數(shù) 138
5.15.4 成員存取器 138
5.15.5 索引成員 140
5.15.6 成員可訪問性 140
5.15.7 構(gòu)造函數(shù) 143
5.15.8 參數(shù)成員 144
5.15.9 繼承 145
5.15.10 實現(xiàn)接口 150
5.15.11 靜態(tài)成員 151
5.15.12 抽象類和抽象成員 153
5.15.13 this類型 155
5.15.14 類類型 156
第6章 TypeScript類型進階 158
6.1 泛型 158
6.1.1 泛型簡介 159
6.1.2 形式類型參數(shù) 160
6.1.3 實際類型參數(shù) 161
6.1.4 泛型約束 162
6.1.5 泛型函數(shù) 165
6.1.6 泛型接口 167
6.1.7 泛型類型別名 168
6.1.8 泛型類 169
6.2 局部類型 170
6.3 聯(lián)合類型 171
6.3.1 聯(lián)合類型字面量 171
6.3.2 聯(lián)合類型的類型成員 173
6.4 交叉類型 176
6.4.1 交叉類型字面量 176
6.4.2 交叉類型的類型成員 178
6.4.3 交叉類型與聯(lián)合類型 180
6.5 索引類型 181
6.5.1 索引類型查詢 182
6.5.2 索引訪問類型 185
6.5.3 索引類型的應(yīng)用 186
6.6 映射對象類型 187
6.6.1 映射對象類型聲明 187
6.6.2 映射對象類型解析 188
6.6.3 映射對象類型應(yīng)用 188
6.6.4 同態(tài)映射對象類型 190
6.7 條件類型 196
6.7.1 條件類型的定義 196
6.7.2 分布式條件類型 197
6.7.3 infer關(guān)鍵字 199
6.8 內(nèi)置工具類型 201
6.8.1 Partial 201
6.8.2 Required 202
6.8.3 Readonly 202
6.8.4 Record 202
6.8.5 Pick 202
6.8.6 Omit 203
6.8.7 Exclude 203
6.8.8 Extract 203
6.8.9 NonNullable 203
6.8.10 Parameters 204
6.8.11 ConstructorParameters 204
6.8.12 ReturnType 204
6.8.13 InstanceType 205
6.8.14 ThisParameterType 205
6.8.15 OmitThisParameter 206
6.8.16 ThisType 206
6.9 類型查詢 206
6.10 類型斷言 207
6.10.1 類型斷言 208
6.10.2 as T類型斷言 208
6.10.3 類型斷言的約束 209
6.10.4 const類型斷言 210
6.10.5 !類型斷言 212
6.11 類型細化 213
6.11.1 類型守衛(wèi) 214
6.11.2 可辨識聯(lián)合類型 225
6.11.3 賦值語句分析 232
6.11.4 基于控制流的類型分析 233
6.11.5 斷言函數(shù) 233
第7章 TypeScript類型深入 238
7.1 子類型兼容性 238
7.1.1 類型系統(tǒng)可靠性 239
7.1.2 子類型的基本性質(zhì) 239
7.1.3 頂端類型與尾端類型 240
7.1.4 原始類型 240
7.1.5 函數(shù)類型 241
7.1.6 對象類型 245
7.1.7 泛型 249
7.1.8 聯(lián)合類型 250
7.1.9 交叉類型 251
7.2 賦值兼容性 251
7.3 類型推斷 253
7.3.1 常規(guī)類型推斷 253
7.3.2 按上下文歸類 255
7.4 類型放寬 256
7.4.1 常規(guī)類型放寬 256
7.4.2 字面量類型放寬 257
7.5 命名空間 261
7.5.1 命名空間聲明 262
7.5.2 導(dǎo)出命名空間內(nèi)的聲明 263
7.5.3 別名導(dǎo)入聲明 265
7.5.4 在多文件中使用命名空間 266
7.5.5 小結(jié) 269
7.6 模塊 269
7.6.1 模塊簡史 269
7.6.2 ECMAScript模塊 273
7.6.3 模塊導(dǎo)出 273
7.6.4 模塊導(dǎo)入 276
7.6.5 重命名模塊導(dǎo)入和導(dǎo)出 278
7.6.6 針對類型的模塊導(dǎo)入與導(dǎo)出 280
7.6.7 動態(tài)模塊導(dǎo)入 284
7.6.8 --module 285
7.7 外部聲明 286
7.7.1 外部類型聲明 287
7.7.2 外部模塊聲明 292
7.8 使用聲明文件 293
7.8.1 語言內(nèi)置的聲明文件 293
7.8.2 第三方聲明文件 293
7.8.3 自定義聲明文件 298
7.9 模塊解析 299
7.9.1 相對模塊導(dǎo)入 299
7.9.2 非相對模塊導(dǎo)入 300
7.9.3 模塊解析策略 301
7.9.4 模塊解析策略之Classic 301
7.9.5 模塊解析策略之Node 304
7.9.6 --baseUrl 308
7.9.7 paths 310
7.9.8 rootDirs 312
7.9.9 導(dǎo)入外部模塊聲明 312
7.9.10 --traceResolution 313
7.10 聲明合并 314
7.10.1 接口聲明合并 315
7.10.2 枚舉聲明合并 317
7.10.3 類聲明合并 318
7.10.4 命名空間聲明合并 318
7.10.5 擴充模塊聲明 321
7.10.6 擴充全局聲明 322
第四篇 TypeScript應(yīng)用
第8章 TypeScript配置管理 324
8.1 編譯器 324
8.1.1 安裝編譯器 325
8.1.2 編譯程序 326
8.2 編譯選項 328
8.2.1 編譯選項風(fēng)格 328
8.2.2 使用編譯選項 330
8.2.3 嚴格類型檢查 331
8.2.4 編譯選項列表 337
8.3 tsconfig.json 338
8.3.1 使用配置文件 338
8.3.2 編譯選項列表 340
8.3.3 編譯文件列表 342
8.3.4 聲明文件列表 346
8.3.5 繼承配置文件 348
8.4 工程引用 351
8.4.1 使用工程引用 352
8.4.2 工程引用示例 353
8.4.3 --build 354
8.4.4 solution模式 356
8.5 JavaScript類型檢查 357
8.5.1 編譯JavaScript 357
8.5.2 JavaScript類型檢查 358
8.5.3 JSDoc與類型 360
8.6 三斜線指令 363
8.6.1 /// 364
8.6.2 /// 366
8.6.3 /// 367
第9章 TypeScript項目實踐 371
9.1 TypeScript與Babel 371
9.1.1 Babel 372
9.1.2 TypeScript編譯器 372
9.1.3 實例演示 374
9.1.4 注意事項 380
9.1.5 小結(jié) 381
9.2 TypeScript與webpack 381
9.2.1 webpack 381
9.2.2 實例演示 381
9.2.3 小結(jié) 385
9.3 TypeScript與ESLint 385
9.3.1 ESLint 386
9.3.2 實例演示 386
9.3.3 集成Visual Studio Code 390
9.3.4 小結(jié) 393
9.4 TypeScript與Visual Studio Code 393
9.4.1 代碼格式化 394
9.4.2 組織模塊導(dǎo)入語句 395
9.4.3 代碼導(dǎo)航 395
9.4.4 快速修復(fù) 396
9.4.5 重構(gòu)工具 396
9.4.6 CodeLens 397