TypeScript 中用联合类型实现状态机,核心是定义字面量联合类型(如 type Status = 'idle' | 'loading' | 'success' | 'error'),配合 switch 穷尽检查、类型安全的状态迁移函数及 reducer 落地,确保编译期捕获非法状态和遗漏处理。

在 TypeScript 中用联合类型实现状态机,核心是把所有合法状态定义为字面量类型的联合,并让状态变量只能取其中某一个值;再配合 switch 或类型守卫做穷尽检查,就能在编译期捕获非法状态迁移和遗漏处理。
定义精确的状态联合类型
不要用字符串或枚举粗略表示状态,而是用字面量类型组合成联合类型,确保每个状态值都不可变且可推导:
- 用
type Status = 'idle' | 'loading' | 'success' | 'error'明确列出所有可能值 - 避免
string或any,否则失去类型约束 - 如果状态携带数据(如 error 附带消息),可用对象联合:
type State = { status: 'idle' } | { status: 'loading' } | { status: 'success'; data: User } | { status: 'error'; message: string };
用 switch + exhaustiveness check 强制处理所有状态
TypeScript 不自动检查 switch 是否覆盖全部联合成员,需手动添加穷尽性校验:
- 在
default分支中调用const _exhaustiveCheck: never = state - 当新增状态但未更新
switch时,TypeScript 会报错:不能将新状态赋给never - 这样能保证每次状态变更逻辑都被显式处理,不会漏掉分支
封装状态迁移为类型安全的方法
把状态转换逻辑收进函数或类方法,用参数和返回值类型约束迁移路径:
立即学习“Java免费学习笔记(深入)”;
- 例如:
transition(from: 'idle', to: 'loading'): LoadingState,限制只允许从 idle 到 loading - 或用映射类型定义合法转移表:
type TransitionMap = { idle: ['loading']; loading: ['success', 'error']; success: ['idle']; error: ['idle', 'loading'] }; - 运行时可校验迁移是否合法,编译期也能提示不支持的跳转
配合 reducer 或 useState 的实际写法
在 React 或状态管理中落地时,注意保持类型流畅通:
- 用
useState<State>()初始化,初始值必须属于联合中的某个具体状态 - reducer 的
action类型也应联合化(如type Action = { type: 'START' } | { type: 'SUCCESS'; payload: User }),再根据 action 和当前 state 计算下一个 state - 编辑器会在你写错状态值(比如拼错
'loaidng')时立刻标红


















