Skip to content

将 TypeScript 命令式代码重构为 fp-ts 函数式模式

解决命令式 TypeScript 代码中常见的错误处理不透明、空值检查冗余、异步回调地狱等痛点,通过 fp-ts 将其转化为类型安全、可组合的函数式流水线。

为什么需要这个技能

传统的命令式 TypeScript 开发依赖 try-catch 捕获异常、通过 if (x === null) 进行防御性编程,以及使用 async/await 处理异步流。这些方式存在几个核心问题:

  • 错误隐式化:函数签名无法告知调用者可能会抛出什么错误。
  • 控制流非线性:大量的嵌套判断和异常跳出使得逻辑难以追踪。
  • 难以组合:将多个可能失败的操作串联在一起时,代码会变得异常臃肿。

通过引入 fp-tsEitherOptionTaskEitherReader 等模式,可以将副作用和错误显式化,利用 pipe 构建清晰的数据流。

适用场景

  • 需要将现有项目中的 try-catch 逻辑重构为类型安全的错误处理。
  • 面对深层嵌套的 null/undefined 检查,希望通过 Option 简化代码。
  • 将基于类(Class)的依赖注入(DI)迁移为更轻量、易测试的 Reader 模式。
  • 处理复杂的异步Promise链,需要更强大的组合能力(如 traverse 并行处理)。

核心工作流

  1. 识别模式映射:根据命令式代码的特征选择对应的函数式容器:
    • try-catch Either (同步) / TaskEither (异步)。
    • null/undefined Option
    • Promise.all A.traverse
    • Class DI Reader
  2. 定义错误与环境类型:在重构前先定义明确的错误 union 类型(如 FetchError | ParseError)或环境接口 AppEnv
  3. 构建数据流水线:使用 pipe 将离散的函数连接起来,通过 flatMap 处理嵌套容器,通过 map 转换成功值。
  4. 处理边界:在程序的最后(如 API 响应层或 UI 层)使用 matchgetOrElse 将函数式容器还原为命令式输出。

快速映射表

命令式模式fp-ts 等价实现
try { } catch { }E.tryCatch() / TE.tryCatch()
throw new Error()E.left() / TE.left()
if (x === null)O.fromNullable()
Promise.then()TE.flatMap()
Promise.all()A.traverse(TE.ApplicativePar)
new Class(deps)RTE.ask()

下载和安装

下载 fp-refactor 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐