TypeScript 速查 — 簡明參考
TypeScript 5 語法、類型系統與最常用慣用法速查手冊,覆蓋約 80% 日常場景。
TypeScript TypeScript 5.x
ECMAScript + 類型 · 多範式 · 結構化 · 靜態(漸進)類型於 JS 之上
學習路徑
先搭好編譯環境(tsc/tsconfig)並理解 TS 是 JS 的超集 → 掌握基礎類型標註、聯合類型與接口 → 深入類型系統(泛型、類型守衞、類型操作)→ 用 class 與模塊組織代碼 → 處理異步與 DOM/Node 類型 → 最後按需查構建配置、測試與調試。FAQ 節適合回頭避坑。
1.Hello World 與構建環境
編譯運行 TypeScript,理解 tsc、tsconfig 與類型檢查流程。
最小程序
TS 是 JS 超集:合法 JS 就是合法 TS。加類型標註後經 tsc 編譯為 JS。
tsc 編譯
tsc 編譯 .ts 為 .js。--noEmit 只做類型檢查不輸出、--watch 監聽改動、--strict 嚴格模式。
tsconfig.json
tsconfig.json 配置編譯:target、module、strict、outDir。npx tsc 自動讀取。
直接運行 TS
用 tsx/ts-node 直接運行 TS 無需先編譯。Node 22 原生支持 --experimental-strip-types。
嚴格模式
strict: true 開啓全部嚴格檢查:null 檢查、隱式 any 報錯、未使用變量警告。新項目必須開。
TS 與 JS 的關係
TS 在編譯期檢查類型,編譯後 JS 無類型信息。類型只在編譯期存在,運行時被擦除。
依賴與類型包
庫需類型定義。@types/* 是 DefinitelyTyped 社區類型包。typescript 是編譯工具依賴。
編輯器集成
VS Code 內置 TS 支持:懸停看類型、報錯紅波浪線、自動補全、重構。錯誤信息直接顯示。
2.變量與類型標註
類型標註、類型推斷、聯合類型、any/unknown 與類型斷言。
類型標註
變量名後 : 類型 標註類型。標註後類型固定,賦其他類型報編譯錯誤。
類型推斷
TS 從初始化值推斷類型,多數情況無需顯式標註。複雜類型推薦顯式接口。
聯合類型
| 聯合類型表示「或」:string | number 兩者皆可。訪問成員需先類型守衞。
any 與 unknown
any 關閉類型檢查(避免);unknown 表示未知(需守衞後才可用)。安全處理外部數據用 unknown。
類型斷言
as 斷言告訴編譯器你比它懂。斷言不改變運行時,只是編譯期聲明。濫用會掩蓋錯誤。
非空斷言
! 後綴斷言值非 null/undefined。僅當確定時用,否則運行時可能崩潰。
字面量類型
字面量類型把類型精確到具體值:'up'、42、true。配合聯合枚舉選項。
解構與類型
解構賦值保留類型。函數參數解構需標註整個參數對象類型。
3.類型系統
基礎類型、對象/數組/元組、接口、泛型、類型別名與類型操作。
基礎類型
string、number、boolean、null、undefined、void、symbol、bigint 基礎類型集合。
數組與元組
number[] 數組、[string, number] 元組(定長定序)、readonly 只讀數組。
對象類型
對象類型描述形狀:屬性、可選 ?、只讀 readonly、方法簽名。
interface 與 type
interface 定義對象形狀(可擴展),type 別名更靈活(聯合/交叉/元組)。日常優先 interface。
枚舉
enum 命名常量集合:數字枚舉、字符串枚舉、const enum。字符串枚舉更常用。
泛型
泛型把類型參數化:T 是類型參數。函數/類/接口通用複用,編譯期確定。
keyof 與索引
keyof 取對象鍵聯合、索引訪問 T[K]、映射類型。類型操作的核心工具。
內置工具類型
Partial/Omit/Pick/Record/Exclude/ReturnType 等映射類型簡化常見轉換。
模板字面量類型
模板字符串語法構造字符串類型。結合聯合生成排列組合。字符串解析類型級技巧。
4.類型守衞與空值
類型守衞、類型收縮、可選鏈、null 處理與引用語義。
類型守衞
typeof、instanceof、in 判斷收窄聯合類型。分支內類型自動收縮。
類型收縮
守衞後類型在作用域內收縮(narrowing)。null 檢查、truthy 檢查都會收窄。
可辨識聯合
可辨識聯合:共享判別字段(kind/type),switch 後類型精確收縮。狀態機建模。
可選鏈與空合併
?. 安全訪問、?? 空值兜底、??= 賦默認。鏈式深訪問防 null 崩潰。
null 與 undefined
strictNullChecks 下 null/undefined 不能賦給普通類型。需顯式聯合或處理。
引用語義
TS 不改變 JS 引用語義:對象按引用共享、數組淺拷貝。類型層面只描述形狀。
自定義類型守衞
is 語法聲明函數是類型守衞:返回 boolean 且參數收窄。過濾數組常用。
斷言函數
asserts 斷言函數聲明不變量:返回 void 但調用後類型收窄。拋錯則中斷。
5.流程控制
分支、循環、switch 與類型收縮的配合。
if / else
if/else 分支 + 類型守衞。條件表達式收窄變量類型。
switch 與窮盡
switch 處理可辨識聯合。default 分支用 never 檢查所有情況已覆蓋。
循環
for/for...of/while 遍歷。數組迭代 for...of,需要索引 for 或 entries。
三元與類型
三元分支兩側類型會聯合。條件返回不同類型時結果是聯合類型。
break 與 continue
continue 跳本輪、break 退出、帶標籤 break/continue 控制嵌套。
提前返回
守衞子句提前 return 減少嵌套。空值檢查後類型收縮。
do...while
do...while 先執行一次再判斷。至少執行一次的循環用。類型不參與。
對象遍歷
Object.keys 遍歷對象鍵。類型斷言 keyof 保證安全。值遍歷用 Object.values。
6.函數
函數標註、可選/默認參數、重載、剩餘參數與 this。
函數類型
函數類型標註:參數類型與返回類型。箭頭函數類型與函數聲明等價。
可選與默認參數
? 可選參數、= 默認參數。默認參數隱含可選。可選參數在必選參數之後。
剩餘參數
...rest 收集不定數量參數為數組。rest 參數需標註數組類型。
重載簽名
重載:多個簽名聲明 + 一個實現。調用時按簽名匹配。按參數組合約束返回類型。
泛型函數
泛型參數約束:T extends 約束。約束限定類型後可用約束上的成員。
this 類型
this 參數標註 this 類型。方法鏈返回 this 實現鏈式調用。箭頭函數不綁定 this。
回調與函數參數
回調函數作為參數:用函數類型標註。數組高階函數 map/filter/reduce 的類型推導。
函數約束技巧
參數聯合收窄、可選回調、返回推斷。函數參數儘量用接口而非具體類。
7.字符串
模板字符串、常用方法、正則與字符處理。
模板字符串
反引號模板字符串:${} 插值、多行保留。類型仍是 string。
常用方法
slice/substring 截取、toUpperCase 轉換、split 分割、includes/startsWith 查詢、replace 替換。
模板字面量類型
類型級模板字符串:${} 拼接類型。推斷 infer 提取字符串結構。
字符與碼點
length 是 UTF-16 碼元數(emoji 算兩個)。碼點遍歷用 for...of / Array.from。
正則
RegExp 匹配替換。match 返回捕獲組數組,matchAll 全局遍歷。類型層面 RegExp 固定。
區域與比較
localeCompare 區域比較、toLocaleLowerCase 區域轉換、Intl 格式化數字日期。
轉義字符
字符串轉義:\n 換行、\t 製表、\\ 反斜槓、\u 碼點。單雙引號內轉義。
反轉與比較
字符串反轉用 split/數組、去空格、去重。比較用 localeCompare 或規範比較。
8.集合與對象
數組、對象、Map/Set 與不可變更新模式。
數組操作
push/pop 尾部、unshift/shift 頭部、splice 增刪、slice 拷貝、includes/indexOf 查詢。
map / filter / reduce
函數式遍歷:map 轉換、filter 過濾、reduce 聚合、find 查找、every/some 判斷。返回新數組不改原數組。
對象操作
展開合併 {...a, ...b}、Object.keys/values/entries 遍歷、keyof 類型鍵。
Map
Map 任意鍵映射:set/get/has/delete/size。保持插入順序,O(1) 查找。
Set
Set 去重集合:add/delete/has/size。去重數組、差集並集。
不可變更新
用展開/拷貝更新而非原地改。對象替換、數組增刪返回新引用。React 狀態常見。
元組與 Record
元組定長、Record 鍵值映射。對象字面量 as const 轉常量。
WeakMap / WeakSet
WeakMap/WeakSet 鍵必須對象且弱引用。不阻止 GC。緩存元數據/副作用用。
9.性能與內存
垃圾回收下的內存觀、大型數據、字符串優化與監控。
垃圾回收
TS/JS 有 GC,無需手動釋放。對象不再引用即回收。長生命週期對象小心閉包持有。
大型數組
大數組操作考慮 TypedArray/流式。filter/map 產生新數組注意開銷。循環複用更省。
字符串內存
字符串不可變,拼接產生新字符串。大量拼接用數組 join 或模板。字符串駐留(interning)。
WeakRef 與緩存
WeakRef 弱引用不阻止回收、WeakMap/WeakSet 鍵弱引用。緩存或記錄副作用用弱容器。
性能技巧
避免 any 拖慢優化、減少重分配、緩存結果。V8 優化依賴穩定形狀對象。
內存監控
Node 查看內存:process.memoryUsage()、--max-old-space-size。瀏覽器用 Performance API。
閉包與內存
閉包持有外部變量,延長其生命週期。循環中閉包陷阱。釋放引用。
TypedArray 與二進制
TypedArray 處理二進制數值:Uint8Array/Float64Array。視圖共享底層 buffer。
10.類與面向對象
class、訪問修飾符、繼承、抽象類、泛型類。
class 基礎
class 語法:字段、構造器、方法。字段可標註類型和可見性。
訪問修飾符
public 公開、private 私有、protected 受保護、readonly 只讀。都是編譯期檢查。
繼承與 override
extends 繼承、super() 調父構造、override 覆蓋父方法。子類是父類(is-a)。
抽象類與接口
abstract 類不能實例化,抽象方法子類必須實現。接口約束形狀。抽象類可有實現。
implements
class implements 接口:類必須滿足接口形狀。一個類可實現多個接口。
泛型類
泛型類:類型參數用於字段與方法。約束限定泛型範圍。
getter / setter
get/set 訪問器包裝字段讀寫。可加校驗與計算邏輯。
靜態成員
static 定義類級字段方法。靜態成員不依賴實例。工廠方法與常量用 static。
11.異常處理
throw/try-catch、錯誤類型、自定義錯誤、異步錯誤。
throw / try-catch
throw 拋錯、try-catch 捕獲、finally 收尾。catch 變量默認 unknown 需收窄。
自定義錯誤
extends Error 自定義錯誤類。攜帶額外信息。錯誤名用於區分類型。
常見錯誤類型
Error 基類:TypeError 類型錯誤、RangeError 越界、ReferenceError 引用錯誤。判斷用 instanceof。
異步錯誤
async 函數 throw 變 rejected Promise。await 時 try-catch 捕獲。Promise.catch 鏈。
錯誤邊界
模塊邊界捕獲並轉換錯誤類型。第三方錯誤統一包裝。錯誤不逃逸導致崩潰。
錯誤處理模式
可預測錯誤返回結果,意外錯誤拋異常。Result 風格(ok/err)與 throw 各有適用。
錯誤信息質量
錯誤信息包含上下文:什麼、哪裏、如何修。自定義錯誤攜帶字段。
未處理拒絕
未捕獲的 rejected Promise 觸發 unhandledrejection。頂層兜底防靜默失敗。
12.輸入輸出
console 輸出、Node 文件/流、fetch 網絡、類型化 JSON。
console 輸出
console.log/info/warn/error、模板輸出、%o 格式化、分組與計數。
fetch 網絡
fetch 異步請求。await 響應、json 解析、錯誤處理、類型斷言結果。
Node 文件
fs/promises 異步讀寫。readFile/writeFile/mkdir/readdir 返回 Promise。
JSON 與類型
JSON.parse/stringify 序列化。parse 結果需守衞驗證,stringify 忽略函數。
流式處理
ReadableStream/Web Streams 處理大響應。讀取進度、逐塊處理。
環境變量與參數
Node 讀取 process.argv / process.env。參數解析、環境變量類型收窄。
瀏覽器 Web API
localStorage/sessionStorage、navigator、WebSocket 的類型。存儲值需序列化。
文件讀取
input[type=file] 獲取 File、FileReader 讀文本/DataURL、對象 URL 預覽。
13.常見誤區
日常開發最容易踩的坑與正確寫法。
濫用 any
any 關掉類型檢查,掩蓋真實錯誤。能用 unknown + 守衞就用。
空值判斷
!! 判斷真值、== null 同時判 null/undefined、數組空判斷。別把 0/'' 當空。
async 誤用
async 函數必返回 Promise。忘 await 變 Promise 泄漏。forEach 不支持 async 等待。
等值比較
=== 嚴格相等。NaN !== NaN。對象比較引用。深比較需手寫或庫。
null 與 undefined 混淆
null 是有意空值,undefined 是未賦值。strictNullChecks 下分別處理。可選鏈 vs 斷言。
this 丟失
回調中 this 變 undefined。箭頭函數綁定或顯式綁定。類字段箭頭函數常用。
收窄失效
屬性訪問後收窄丟失。解構後才收窄。函數參數重新賦值會變寬。
窮盡檢查
可辨識聯合 default 用 never 檢查。新增類型分支漏處理編譯報錯。
拷貝與修改
數組/對象引用共享導致誤改。更新要拷貝。sort 原地改數組。
14.併發與異步
Promise、async/await、Worker 線程與事件循環。
Promise
Promise 表示異步結果。then 鏈、catch 錯誤、finally 收尾。類型標註 Promise<T>。
async / await
async 函數返回 Promise。await 解包。錯誤用 try-catch。頂層 await 需 ESM。
並行與競態
Promise.all 全部完成、allSettled 全部(含失敗)、race 最先完成、any 首個成功。
Worker 線程
Web Worker / Node worker_threads 並行計算。postMessage 通信、transferable 轉移所有權。
事件循環
同步代碼先執行,微任務(Promise)先於宏任務(setTimeout)。阻塞會卡住一切。
生成器
function* 生成器惰性產出。yield 暫停恢復。Generator 類型標註。
異步迭代器
for await 遍歷異步數據源。異步生成器 async function*。流式數據消費。
併發限制
控制同時運行的異步任務數。分批、信號量或 p-limit 思路。避免打爆資源。
15.網絡與模塊
模塊系統、import/export、fetch 與類型化 API 封裝。
ES 模塊
import/export 靜態導入導出。TS 類型導出用 export type。模塊隔離作用域。
類型導入
import type 只導入類型,編譯時擦除。避免運行時依賴與循環引用。
類型化 API 封裝
封裝 fetch 返回強類型。響應校驗、錯誤統一處理。泛型請求函數。
Node HTTP 服務
node:http 或框架(Express/Fastify)。類型化請求響應。路由處理。
DOM 類型
document.getElementById 返回類型、事件類型、HTML 元素類型映射。
URL 與參數
URLSearchParams 構造查詢串、URL 解析。類型安全讀參數。
WebSocket
WebSocket 雙向通信。onmessage 事件、泛型數據、readyState 狀態。
請求頭與鑑權
Headers 類型安全設置。Authorization Bearer、Content-Type。攔截器統一注入。
16.時間與日期
Date 對象、時間戳、格式化與時區。
Date 基礎
Date 構造、getFullYear/getMonth/getDate 讀取、set 系列設置。月份 0 起。
時間戳
getTime() 毫秒時間戳、Date.now()、Date.parse。日期比較用時間戳。
格式化
toISOString UTC 格式、toLocaleDateString 本地格式、Intl.DateTimeFormat 自定義。
時區
時間戳是 UTC 毫秒,格式化才有本地時區。Intl 按 timeZone 選項指定時區。
定時器
setTimeout 延時、setInterval 週期、clearTimeout 取消。返回值類型 number。
時長與區間
兩個時間戳相減得毫秒時長。區間判斷用時間戳比較。防濫用 setInterval 漂移。
日期庫
dayjs/date-fns 提供清晰 API 與時區處理。體積小、不可變。複雜時區建議用庫。
高精度計時
performance.now() 毫秒級高精度、不受系統時間調整影響。性能測量用。
17.進程與系統
Node 進程、命令行工具、標準流與構建產物運行。
Node 進程
process 全局對象:argv 參數、env 環境、exit 退出碼、stdout/stderr 流。
命令行工具
寫 CLI:解析參數、幫助輸出、退出碼。shebang 讓腳本可執行。
標準流
stdin 讀輸入、stdout 輸出、stderr 錯誤。readline 交互。管道數據。
運行編譯產物
tsc 編譯後 node dist/main.js 運行。package.json bin 註冊命令。類型聲明 d.ts。
執行系統命令
execFile 執行外部命令、spawn 流式。child_process 類型。注意轉義避免注入。
退出碼
0 成功、非 0 失敗。約定:1 通用錯誤、2 用法錯誤。腳本在 CI 依賴退出碼。
npm scripts
package.json scripts 編排命令。pre/post 鈎子、串聯 &&、並行 &。構建鏈常用。
配置與環境
dotenv 加載 .env、類型化配置對象、運行時校驗。配置與代碼分離。
18.正則與文本處理
正則語法、標誌、類型化匹配與文本處理慣用法。
正則語法
字面量 /.../ 或 RegExp 構造。字符類、量詞、分組、錨點。
標誌
g 全局、i 忽略大小寫、m 多行、s 點通配換行、u unicode、y 粘性。
匹配與提取
match 返回數組(0 全匹配 + 捕獲組)、matchAll 全局遍歷、match 失敗 null 需判空。
替換
replace 字符串/函數替換。$1 捕獲引用、全局 g 全替換。函數式替換處理邏輯。
驗證慣用法
整體匹配用 ^...$ 錨定。數字/郵箱/URL 常用模式。test 返回 boolean。
正則性能
避免災難性回溯:嵌套量詞。預編譯正則。g 狀態 lastIndex 注意。
正則常見坑
字面量需轉義、g 標誌 lastIndex 狀態、貪婪匹配、\ 在字符串裏的雙重轉義。
常用模式
身份證/手機號/顏色/日期等常用正則片段。匹配業務格式校驗。
19.構建與工程化
tsconfig、打包工具、Lint/格式化、測試與 CI。
tsconfig 詳解
常用編譯選項:moduleResolution、declaration、noUnusedLocals、esModuleInterop、paths 路徑別名。
打包工具
Vite/Webpack/Rollup 打包。Vite 是 TS/前端默認。庫用 tsup/Rollup 出 ESM+CJS。
Lint 與格式化
ESLint 規則檢查、Prettier 格式化。ts-eslint 提供類型感知規則。
測試
Vitest/Jest 單元測試。describe/it/expect。類型與運行分離。ts 直接測。
CI 與部署
CI 階段:類型檢查、Lint、測試、構建。tsc --noEmit 攔截類型錯誤。
調試
sourceMap + Node inspect 斷點調試。console 調試、類型斷言輔助。
npm 發佈
發佈庫:files 指定發佈內容、version 語義化、main/types/exports 入口。發佈前構建。
monorepo 配置
npm/pnpm workspaces 多包倉庫。共享依賴、包間引用、統一腳本。
關於本速查
本頁是 TypeScript 5.x 的自包含速查手冊,覆蓋類型系統與語言核心在真實項目中約 80% 的常見用法。內容偏向現代慣用法:接口與類型別名、泛型、聯合/交叉類型、類型收窄、字面量類型、keyof/typeof、映射類型與條件類型,以及與異步編程的結合。TypeScript 由微軟於 2012 年發佈,是 JavaScript 的超集,在編譯期為 JavaScript 添加靜態類型檢查,大幅提升大型項目的可維護性,是當前前端工程化的主流選擇。 19 個章節各自聚焦一個主題:基礎語法、變量與類型推斷、類型系統、引用與值語義、控制流、函數與重載、字符串與模板、集合、內存與類型擦除、類與接口、錯誤處理、輸入輸出、常見誤區、併發(異步類型)、網絡、時間、進程、正則與構建工具(tsc/tsconfig)。每個小節都配有「概念介紹 + 可直接複製的代碼片段」。 所有代碼與文字均在瀏覽器本地渲染,無任何數據離開你的設備。權威參考見 TypeScript 官方手冊。
版本 2.1.0