fp-ts 务实函数式编程
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-02qudk26/fp-ts-pragmatic。
技能介绍
要解决什么问题
在 TypeScript 里引入 fp-ts 时,常见困境是:教程堆满范畴论术语,团队读不懂;或者为了「函数式」把简单 null 检查改成嵌套 pipe,反而更难维护。本技能针对的是日常业务代码:可空值、预期内失败、异步链式调用,以及从命令式写法逐步重构,而不是把 FP 当成信仰。
技能如何组织内容
文档按 80/20 排列,优先讲五个高频模式:
pipe:对同一份数据连续做 3 次以上变换时,按阅读顺序链式调用,减少中间变量和深层嵌套。Option:用O.fromNullable、O.flatMap、O.getOrElse处理缺失值,替代散落的if (x !== null && x !== undefined)。Either:用E.right/E.left把成功与失败显式化,配合E.tryCatch、E.fold替代「抛异常 + try/catch」处理预期内错误。map/flatMap:在容器内变换或串联可能失败的下一步,而不反复手动解包。
此外给出可对照的重构示例(回调嵌套 → pipe、多处 null 检查 → Option 链、Promise + try/catch → TaskEither 思路),以及速查表把「大白话意图」映射到 fp-ts API。进阶章节单独列出 TaskEither、Validation、Reader 等,并明确建议先吃透基础再扩展。
适用边界
黄金法则是:若 FP 让代码更难读,就不要用。 简单 null 检查、简单循环、性能敏感路径、或团队尚不熟悉 FP 时,应保持命令式或直白写法。使用前自问:初级开发者能否读懂;若只有你能维护,则不算好代码。
使用场景
- 接手遗留 TS 服务,多处 `if (x != null)` 与嵌套三元,需要改成 Option 链并保持行为不变
- 编写解析/校验接口:失败是常态,希望用 Either 返回 typed error 而不是 throw 后在上层 catch
- 同一条业务数据要经过过滤、映射、聚合等多步变换,中间临时变量过多,想用 pipe 按阅读顺序串起来
- 把 Promise 链 + try/catch 的异步流程整理成可组合的 TaskEither,方便统一处理左值错误
适合人员
- 刚引入 fp-ts 的前端/全栈工程师,需要跳过范畴论、直接对照 API 改业务代码
- 负责支付或订单域 TypeScript 的同学,要把可空字段与业务错误从异常流里拆出来
- 带 3~5 人 TS 小队的 Tech Lead,在代码评审里权衡「用 FP」与「团队能读懂」
- 正在把命令式模块拆成纯函数的维护者,需要 pipe/Option/Either 的重构前后示例