fp-ts-errors
使用fp-ts的Either和TaskEither将错误作为值处理,可编写更清晰、更可预测的TypeScript代码。适用于基于fp-ts实现错误处理模式时。
fp-ts-errors - TypeScript 函数式错误处理实战
技能概述
使用 fp-ts 的 Either 和 TaskEither 将错误作为值处理,用类型安全的函数式模式替代 try/catch,让 TypeScript 代码更简洁、更可预测。
适用场景
-
API 和服务开发 当你的 API 或服务需要明确的错误类型时,Either 让错误在类型系统中可见。不再有"这个函数可能会抛出什么异常"的猜测——TypeScript 编译器会强制你处理所有可能的错误情况。
-
表单验证 需要收集多个验证错误而不是只返回第一个时,使用 fp-ts 的 Validation 模式可以一次性返回所有字段的问题,提升用户体验。
-
异步流程编排 当多个异步操作需要串联执行且每一步都可能失败时,TaskEither 的链式调用让控制流清晰明了,自动在第一个错误处停止,无需嵌套的 try/catch。
核心功能
-
Either 类型安全错误处理 Either<E, A> 要么包含错误(Left),要么包含成功值(Right)。TypeScript 类型系统会强制调用者处理两种情况,不再有被遗忘的 try/catch。支持 map、chain、filterOrElse 等丰富的组合操作。
-
TaskEither 异步错误处理 TaskEither 是 Either 的异步版本,完美替代 Promise + try/catch 模式。支持并行执行、重试机制、回退策略等常见异步模式,所有操作都保持类型安全。
-
错误累积验证 使用 getApplicativeValidation 可以在验证过程中累积所有错误而不是遇到第一个就返回。特别适合表单验证场景,让用户一次性看到所有需要修正的问题。
常见问题
fp-ts Either 和 TaskEither 有什么区别?
Either 用于同步操作,直接包含错误或成功值;TaskEither 用于异步操作,本质上是一个返回 Promise 的函数。TaskEither 拥有与 Either 相同的所有操作符(map、chain、fold 等),只是执行时会返回 Promise。简单来说:同步用 Either,异步用 TaskEither。
如何用 fp-ts 收集表单验证的所有错误?
使用 E.getApplicativeValidation 配合 sequenceS。普通的 Either chain 会在第一个错误处停止,但 Validation 模式会继续执行所有验证并收集所有错误。配合 NonEmptyArray 可以确保至少有一个错误,类型更安全。
为什么要用 Either 替代 try catch?
传统的异常抛出在类型签名中不可见,函数承诺返回 User 实际上可能抛出三个不同的异常。Either 让错误成为类型的一部分,TypeScript 会强制你处理所有情况。此外,Either 支持函数式组合,可以用 pipe 优雅地串联多个可能失败的操作,代码更清晰,测试也更容易。