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