SuperAPI AI 工具集

fp-ts Option and Either

编程与开发

查看项目

更新于 10-16 02:05

技能介绍

本技能是一份关于 fp-ts 中 Option 与 Either 的实用指南,目标是帮助开发者用更安全的方式编写 TypeScript 代码,主要围绕可空值管理与函数式错误处理展开。

一、用途与选择 Option 用于值可能存在或不存在的场景:可空或 undefined 情况、不需要知道值为何缺失、处理可选字段、数组查找或字典访问。Either 用于操作可能失败且需要错误信息的场景:替代 try-catch、需要传达不同失败原因、构建校验流程。

二、导入方式 Option 导入:import * as O from 'fp-ts/Option';Either 导入:import * as E from 'fp-ts/Either';两者可同时导入,并配合 import { pipe, flow } from 'fp-ts/function' 使用。

三、Option 的主要能力

  1. 转换可空值:fromNullable 将 null/undefined 转为 None,否则为 Some;fromPredicate 在谓词通过时创建 Some;也可用 O.some 与 O.none 手动构造。
  2. 取值:getOrElse 提供默认值;getOrElseW 支持更宽类型;fold/match 显式处理两种情况。
  3. 变换:map 变换内部值;chain(flatMap)用于变换返回 Option 的情况;filter 仅在谓词通过时保留 Some。
  4. 组合:sequenceArray 将 Option<T>[] 转为 Option<T[]>;ap 将 Option<(a: A) => B> 应用于 Option<A>。

四、Either 的主要能力

  1. 将 try-catch 转为 Either:tryCatch 包装会抛出的函数;tryCatchK 创建返回 Either 的函数。
  2. 创建值:E.right 与 E.left 手动构造;fromNullable 将可空值转为带错误的 Either;fromPredicate 在谓词通过时创建 Right。
  3. 取值:fold/match 处理两种情况;getOrElse 为 Left 提供默认值;getOrElseW 支持更宽类型。
  4. 变换:map 变换 Right 值;mapLeft 变换 Left 值(错误映射);bimap 同时变换两侧;chain(flatMap)用于变换返回 Either 的情况;chainW 在错误类型不同时自动拓宽联合类型。

五、校验模式 可定义 ValidationError 类型,分别编写 validateEmail、validatePassword 等返回 Either 的函数。顺序校验(遇到第一个错误即停止)可用 E.Do 配合 E.bind 组合。若需收集所有错误,可使用 fp-ts 的 Validation,通过 E.getApplicativeValidation 与 getSemigroup 构建 applicative 校验。

六、常见模式 安全数组访问:A.head 安全获取首元素,A.lookup 按索引安全获取元素。安全对象属性访问:R.lookup 安全读取 Record 属性。Option 与 Either 互转:O.toEither 将 Option 转为 Either,E.toOption 将 Either 转为 Option(丢弃错误)。

七、异步操作 使用 TaskEither:TE.tryCatch 包装异步操作,TE.chain 串联异步步骤,TE.map 变换结果,最终执行得到 Either。

八、最佳实践 优先使用 pipe 而非方法链,便于组合与 tree-shaking;在系统边界用 fromNullable 转换外部可空值;使用描述性错误类型而非泛型字符串;利用类型推断;错误类型不同时用 chainW 自动拓宽联合;最终取值优先用 fold/match 确保两种情况都被处理。

九、应避免的反模式 不要用 isSome/isRight 做控制流(会失去类型收窄优势),应使用 fold/match;不要嵌套 Option/Either(会产生 Option<Option<T>>),应使用 chain 展平;不要过早使用 getOrElse(会失去组合能力),应保持在 Option 上下文中到最后再取值;不要忽略 Left 值(会静默丢弃错误信息),应适当处理或记录错误;不要混用范式(如在 Either 流程外再包 try-catch),应始终留在 Either 世界中。