Skip to content

使用 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 值或异常代码,可以使用 fromNullabletryCatch 快速转换。

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 转换为 Either

2. 转换与链式调用

利用 map 处理成功路径,mapLeft 处理错误路径,flatMap 用于将多个 Either 操作串联。

typescript
E.map(fn)                // 转换 Right 中的值
E.mapLeft(fn)            // 转换 Left 中的错误
E.flatMap(fn)            // 链式调用(fn 必须返回 Either)
E.filterOrElse(pred, toErr) // 如果谓词失败,将 Right 转为 Left

3. 提取结果

最后通过 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

你可能还需要

暂无推荐