Appearance
使用 fp-ts 的 Either 类型实现类型安全的错误处理
解决传统 try/catch 导致错误类型丢失的问题:通过引入 Either 类型(Right 代表成功,Left 代表失败),将错误处理直接编码到类型系统中,实现更健壮的验证和函数链式调用。
为什么需要这个技能
在 TypeScript 中,传统的 try/catch 块无法在类型层面定义可能抛出的错误,这导致调用方在不阅读文档的情况下很难知道需要捕获什么异常。
Either 模式将错误处理从“副作用”转变为“返回值”。通过 Right(value) 表示成功,Left(error) 表示失败,开发者可以强制在编译阶段处理潜在的错误分支,避免运行时崩溃,并能通过 pipe 轻松地将多个可能失败的操作串联起来。
适用场景
- 需要在同步操作中实现类型安全的错误处理时。
- 进行复杂的数据校验(Validation),且需要记录具体的错误信息时。
- 将传统的抛出异常(throwing)代码重构为函数式风格的错误流时。
- 需要一个简洁的 fp-ts Cheat Sheet 来快速查阅 API 映射。
核心工作流
1. 创建 Either 实例
使用 E.right 封装成功值,E.left 封装错误值。对于 null 值或异常代码,可以使用 fromNullable 或 tryCatch 快速转换。
typescript
import * as E from 'fp-ts/Either'
E.right(value) // 成功
E.left(error) // 失败
E.fromNullable(err)(x) // null → Left(err), 否则 Right(x)
E.tryCatch(fn, toError) // 将 try/catch 转换为 Either2. 转换与链式调用
利用 map 处理成功路径,mapLeft 处理错误路径,flatMap 用于将多个 Either 操作串联。
typescript
E.map(fn) // 转换 Right 中的值
E.mapLeft(fn) // 转换 Left 中的错误
E.flatMap(fn) // 链式调用(fn 必须返回 Either)
E.filterOrElse(pred, toErr) // 如果谓词失败,将 Right 转为 Left3. 提取结果
最后通过 getOrElse 提供默认值,或使用 match 对两种情况进行模式匹配。
typescript
E.getOrElse(err => default) // 获取 Right 值,否则返回默认值
E.match(onLeft, onRight) // 针对左/右两种情况执行不同回调综合示例:验证流
typescript
import { pipe } from 'fp-ts/function'
import * as E from 'fp-ts/Either'
// 定义校验函数
const validateEmail = (s: string): E.Either<string, string> =>
s.includes('@') ? E.right(s) : E.left('Invalid email')
// 链式校验(遇到第一个错误即停止)
pipe(
E.right({ email: 'test@example.com', age: 25 }),
E.flatMap(d => pipe(validateEmail(d.email), E.map(() => d))),
E.flatMap(d => d.age >= 18 ? E.right(d) : E.left('Must be 18+'))
)下载和安装
下载 fp-either-ref 中文版 Skill ZIP
解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md。
你可能还需要
暂无推荐