fp-ts 实用错误处理
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-02qudk26/fp-ts-errors。
技能介绍
问题从哪来
在 TypeScript 里,try/catch 让失败路径从类型里「消失」:调用方不知道函数会抛什么,嵌套捕获又容易变成意大利面。表单校验、多步 API、批量处理时,你往往还要收集全部错误,而不是碰到第一个就停——这和「抛一次、捕一次」的模型天然不对盘。
技能在教什么
核心约定很简单:错误只是数据。用 fp-ts 的 Either(同步)和 TaskEither(异步)把失败显式放进返回值,让编译器能追踪 Left / Right。
- Either 基础:
E.left/E.right表示失败与成功;E.tryCatch把会抛异常的代码包成 Either;E.fromNullable把可空值转成带错误的分支。 - 链式组合:用
pipe+E.chain串起可能失败的多步;错误类型不一致时用E.chainW;第一个Left会截断后续步骤,控制流比嵌套try/catch清晰。 - 累积校验:表单等场景用 applicative(如
sequenceS(validation))一次收集字段级错误,而不是只返回第一个。 - 异步与边界:
TaskEither对应「惰性执行的Promise<Either>」;在系统边界用TE.tryCatch、TE.fromTask等把 Promise/抛异常代码收进来,需要对接外部 API 时再用fold或转回 Promise 作为逃生舱。
文档里还给了用户输入解析、带完整错误的 HTTP 调用、列表项部分失败、批量部分成功等真实场景示例,以及 Either / TaskEither 的快速对照表。
适用边界
- 适合愿意引入 fp-ts 与函数式组合(
pipe、chain)的团队;若项目完全拒绝这类依赖,价值主要在模式理解而非即插即用。 Either管同步失败路径;真正 I/O 应走TaskEither,别混用概念。- 遗留代码里大量
throw和裸Promise时,需要在模块边界做转换,而不是指望一次重写全库。
使用场景
- 在 TypeScript 服务里把多层 try/catch 改成 Either 管道,逐步调用校验、查库、写库且任一步失败都有明确错误类型
- 为注册/结算表单做字段校验,需要一次返回全部字段错误而不是只提示第一个失败项
- 封装调用外部 HTTP 或 JSON 解析的代码,用 TaskEither 统一处理网络异常与业务 Left 并在边界 fold 成 API 响应
- 批量导入或处理列表数据时,部分条目解析失败仍要继续处理其余项并汇总成功与失败结果
适合人员
- 维护 Node/TS 后端接口、希望错误类型出现在函数签名而非文档里的后端工程师
- 负责复杂表单与校验 UX、要把「首个错误」改成「全量字段反馈」的前端或全栈工程师
- 已在项目里使用 fp-ts、需要把遗留 throw/Promise 代码在模块边界接入 Either/TaskEither 的维护者
- 编写 CLI 或脚本解析用户输入与配置文件、想用 Result 模式替代散落 try/catch 的 TypeScript 开发者