stateMachine
package version >=0.8.0
shadcn any version
author: cmtlyt
update time: 2026/06/09 10:49:00
通用有限状态机,支持表驱动配置、Guard 守卫、Action 动作、事件队列、Context 隔离,同时提供同步和异步两种模式。
特性
- 表驱动配置:声明式定义状态、转换、守卫和动作,无需手写 if/switch
- Guard 守卫:布尔函数控制转换是否允许,支持多规则按序匹配
- Action 动作:完整生命周期链 onExit → transition action → onEntry
- 事件队列:FIFO 串行消费,Action 中触发事件自动入队,防止递归
- 同步/异步双模式:通过
async配置切换,TypeScript 条件类型自动推断返回值 - Context 隔离:业务数据通过 Context 对象传递,
getContext()返回不可变快照 - 防御性编程:循环检测、队列溢出保护、disposed 保护、未定义状态校验
install
npm
shadcn
usage
基础用法
简单状态切换
带 Context 的状态机
Guard 守卫
命名守卫和动作
高级用法
异步模式
生命周期动作
订阅状态变化
Final 状态
API
createStateMachine
Config 参数
StateNode
TransitionConfig
Settings
返回值
注意事项
⚠️ 同步与异步模式
设置 async: true 后,trigger() 返回 Promise<boolean>,Guard 和 Action 均可使用 async 函数。同步模式下 trigger() 直接返回 boolean。TypeScript 会根据 async 配置自动推断返回类型,无需手动断言。
⚠️ 事件队列与递归保护
在 Action 中调用 trigger() 不会立即执行,而是将事件放入队列等待当前转换完成后按 FIFO 顺序处理。队列超过 maxQueueSize 时新事件会被丢弃并发出警告。
⚠️ 循环检测
同一事件在同一状态连续触发超过 maxCyclicCount 次时会抛出错误,防止死循环。可通过 settings.maxCyclicCount 调整阈值。
⚠️ Disposed 状态
调用 dispose() 后状态机不再接受任何事件,队列和订阅均被清理。再次调用 trigger() 会抛出错误。