Quick reference for Either type. Use when user needs error handling, validation, or operations that can fail with typed errors.
技能概述
fp-either-ref 技能是一个Either类型的快速参考卡片,提供简洁的API参考和常用模式。Either表示成功或失败,Right(value)表示成功,Left(error)表示失败。该技能为需要类型化同步错误处理的场景提供快速参考,包括验证、可能失败的操作、以及将抛出异常的代码转换为Either。适用于需要快速查阅Either操作符和模式的开发者。
下载地址:agentic-awesome-skills/skills/fp-either-ref at main · sickn33/agentic-awesome-skills · GitHub
核心概念
Either = 成功或失败。Right(value)或Left(error)。
主要功能
- 创建Either值: right、left、fromNullable、tryCatch
- 转换操作: map、mapLeft、flatMap、filterOrElse
- 提取值: getOrElse、match、toUnion
- 验证模式: 链式验证,在第一个错误时停止
- 异常转换: 将try/catch代码转换为Either
触发条件
在以下情况下应该调用此技能:
- 需要类型化同步错误处理的fp-ts快速参考时
- 任务涉及验证、可能失败的操作或将抛出异常的代码转换为Either时
- 想要紧凑的速查表而非长篇教程时
创建Either
import * as E from 'fp-ts/Either'
E.right(value) // 成功
E.left(error) // 失败
E.fromNullable(err)(x) // null → Left(err), else Right(x)
E.tryCatch(fn, toError) // try/catch → Either
转换操作
E.map(fn) // 转换Right值
E.mapLeft(fn) // 转换Left错误
E.flatMap(fn) // 链接(fn返回Either)
E.filterOrElse(pred, toErr) // Right → Left如果pred失败
提取值
E.getOrElse(err => default) // 获取Right或默认值
E.match(onLeft, onRight) // 模式匹配
E.toUnion(either) // E | A (丢失类型信息)
常用模式
验证
使用Either进行验证,链式调用在第一个错误时停止:
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+')
)
)
转换抛出异常的代码
将try/catch代码转换为Either:
const parseJson = (s: string) =>
E.tryCatch(
() => JSON.parse(s),
(e) => `Parse error: ${e}`
)
Either vs try/catch
try/catch的问题
错误不在类型中,容易忘记处理,难以组合。
Either的优势
错误在类型中显式声明,强制处理错误情况,易于链式组合。
最佳实践
- 使用Either当错误类型重要时: 需要区分不同类型的错误
- 链式操作: 使用flatMap组合多个可能失败的操作
- 提供有意义的错误信息: 错误应该包含足够的上下文
- 在边界处转换: 将抛出异常的第三方库包装为Either
- 使用具体的错误类型: 避免使用string或Error,定义具体的错误类型
限制说明
重要限制:
- 仅在任务明确匹配所述范围时使用此技能
- 不要将输出替代环境特定的验证、测试或专家审查
- 如果缺少必需的输入、权限、安全边界或成功标准,请停止并请求澄清