SuperAPI AI 工具集

effect-core-patterns

编程与开发

查看项目

更新于 10-16 02:44

技能介绍

用途

effect-core-patterns 是一个面向 Effect 库的核心模式技能,用于构建类型安全、可组合的应用程序。它主要解决:如何创建 Effect、如何组合 Effect、如何处理错误与依赖,以及如何运行 Effect。

主要能力

Effect 类型

Effect 类型拥有三个类型参数:Effect<Success, Error, Requirements>。

  • Success(A):Effect 成功时产生的值的类型。
  • Error(E):可能发生的预期错误类型(无错误时使用 never)。
  • Requirements(R):所需的上下文依赖(无依赖时使用 never)。

示例中包含简单的成功 Effect(Effect.succeed(42))、可失败的 Effect(Effect.fail),以及声明依赖 UserService 的 Effect。

创建 Effect

  • Effect.succeed:始终成功,用于纯值或 void Effect。
  • Effect.fail:用于可恢复的预期错误,示例中定义了 ValidationError。
  • Effect.sync:用于有副作用的同步操作,如递增计数器、日志、获取时间戳;注意函数不应抛出,抛出会变成 defect。
  • Effect.try:用于可能抛出的同步操作,如安全解析 JSON,并可通过 catch 自定义错误映射。
  • Effect.promise:用于不应 reject 的 Promise,如延时、fetch;若 Promise reject 会变成 defect。
  • Effect.tryPromise:用于可能 reject 的 Promise,如带 NetworkError 的 fetchUser;也可用简化版,错误变为 UnknownException。
  • Effect.async:用于包装回调式 API,如 setTimeout、Node.js 的 fs.readFile,并可在中断时清理。

使用 Effect.gen 组合

Effect.gen 允许以 generator 语法编写 Effect 代码,示例包括基本组合、错误处理、顺序操作(获取用户资料)、使用控制流、以及通过短路进行错误处理(safeDivide)。

运行 Effect

  • Effect.runSync:用于无异步操作或无依赖的 Effect;对可失败 Effect 会抛出;不能用于异步或带依赖的 Effect。
  • Effect.runPromise:用于无依赖的异步 Effect;失败时 reject。
  • Effect.runPromiseExit:获取包含成功/失败详情的完整 Exit 信息,配合 Exit.isSuccess / Exit.isFailure 使用。

构建管道

  • Effect.map:转换成功值。
  • Effect.flatMap:链接相互依赖的 Effect。
  • Effect.andThen:顺序组合,可忽略前一个结果或为其提供值。
  • Effect.tap:执行副作用但不改变流动的值。

Effect 转换

  • Effect.mapError:转换错误类型。
  • Effect.mapBoth:同时转换成功与错误。
  • Effect.orElse:失败时回退,可基于错误类型选择不同后备 Effect。

使用方式

技能提供大量 TypeScript 代码示例,展示导入、构造、组合、运行与转换 Effect 的写法。可通过 pipe 或 Effect.gen 组织代码。

适用场景

当需要构建类型安全的 Effect 应用、创建和组合 effectful 操作、以类型安全方式处理错误、处理异步操作与 Promise、显式管理副作用、创建转换管道、将回调式 API 转为 Effect、构建可维护可组合代码、利用函数式编程模式、确保 Effect 的编译期安全时,适合使用本技能。

最佳实践与常见陷阱

最佳实践包括:复杂组合优先使用 Effect.gen;使用标签联合类型标注错误;区分错误与 defect;保持 Effect 纯净;使用描述性命名;组合小型 Effect;显式处理依赖;标注 Effect 类型;简单转换使用 pipe;独立测试 Effect。

常见陷阱包括:对异步 Effect 使用 runSync;不处理错误;错误混用 Promise 与 Effect;忽略依赖;在 Effect.sync 中抛出;不使用 Effect.gen;错误类型不具体;本可并行却使用顺序;过度使用 map/flatMap;未利用类型安全。

限制

资料未提供该技能的收费、价格、平台支持范围等其他信息。