# ts-fsm **Repository Path**: andwp/ts-fsm ## Basic Information - **Project Name**: ts-fsm - **Description**: ts实现的状态机 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-10 - **Last Updated**: 2025-11-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TypeScript 有限状态机(FSM) 一个轻量级、类型安全的TypeScript有限状态机实现。 ## 初始化 ### 执行环境必要条件 要运行本项目,您需要满足以下条件: 1. **Node.js环境**:需要安装Node.js(推荐版本14.x或更高) 2. **npm包管理工具**:通常随Node.js一起安装 3. **TypeScript**:项目使用TypeScript(^5.2.2) 4. **ts-node**:用于直接运行TypeScript文件(^10.9.1) ### 方法一:使用调试文件 我们创建了一个专门的调试文件,包含详细的日志输出: ```bash # 运行调试文件 npm run debug ``` 这个文件会输出每个状态转换的详细信息,包括: - 状态进入和退出的日志 - 转换类型和结果 - 当前状态信息 ## 常见问题排查 ### 状态转换不生效 如果状态转换没有按预期工作,请检查: 1. 是否正确添加了转换关系 `addTransition(type, state)` 2. 检查 `onEnter` 钩子是否返回了 `true`,如果返回 `false` 会阻止转换 3. 确认当前状态确实有对应类型的转换 ### 钩子函数未执行 如果钩子函数没有被调用,请检查: 1. 钩子名称是否正确(注意:`onExitd` 而不是 `onExit`) 2. 是否在状态转换前设置了钩子函数 ## 项目文件结构 ``` ├── dist/ # 编译后的JavaScript文件 ├── state.ts # 状态机以及相关类实现 ├── example2.ts # 示例代码(信号灯状态) ├── package.json # 项目配置 ├── tsconfig.json # TypeScript配置 └── README.md # 项目文档 ``` ## 运行项目 ```bash # 安装依赖 npm install # 运行示例 npm start # 编译项目 npm run build # 运行编译后的文件 node dist/example.js ``` ## 调试技巧 1. **使用条件断点**:在状态转换处设置条件断点,只在特定状态时触发 2. **添加详细日志**:在关键位置添加更多日志输出,跟踪状态变化 3. **逐步执行**:使用调试器的步进功能,逐行执行代码 4. **检查状态转换表**:在每次转换前,打印当前状态的所有可能转换 ## 相关API文档 ### State 类 - `addTransition(type: IType, state: State)`: 添加状态转换 - `doTransition(type: IType)`: 执行状态转换 - `onEnter?: (type: IType) => boolean`: 进入状态前的钩子,返回false阻止进入 - `onEntered?: (type: IType) => void`: 进入状态后的钩子 - `onExitd?: (type: IType) => void`: 退出状态的钩子 ### Context 类 - `initState(state: State)`: 设置初始状态 - `doTransition(type: IType)`: 执行状态转换 - `currentState`: 当前状态 - `lastState`: 上一个状态