如何将fp-ts的Either转换为Effect的Either?
在fp-ts和Effect的Either之间转换的方案
由于fp-ts和Effect的Either只是类型定义不同,但底层结构完全兼容(都是带_tag标识的Left/Right对象),所以有两种可靠的转换方式:
1. 快速类型断言(适合简单场景)
因为两者的运行时结构一致,直接用类型断言就能绕过TypeScript的类型检查,实现零成本转换:
import * as E from '@effect/data/Either' import * as F from 'fp-ts/Either' // fp-ts → Effect const fe: F.Either<string, number> = F.right(123) const ee = fe as unknown as E.Either<string, number> // Effect → fp-ts const ef = ee as unknown as F.Either<string, number>
2. 显式转换函数(适合严谨/大规模迁移场景)
如果希望代码更清晰,或者担心未来结构变动,可以写个简单的转换函数,通过判断_tag或使用库提供的isLeft/isRight方法来转换:
import * as E from '@effect/data/Either' import * as F from 'fp-ts/Either' // fp-ts Either 转 Effect Either const fpTsToEffect = <Err, Val>(fpEither: F.Either<Err, Val>): E.Either<Err, Val> => F.isLeft(fpEither) ? E.left(fpEither.left) : E.right(fpEither.right) // Effect Either 转 fp-ts Either const effectToFpTs = <Err, Val>(effectEither: E.Either<Err, Val>): F.Either<Err, Val> => E.isLeft(effectEither) ? F.left(effectEither.left) : F.right(effectEither.right) // 使用示例 const fe: F.Either<string, number> = F.right(123) const ee = fpTsToEffect(fe) const ef = effectToFpTs(ee)
额外提示
如果是大规模迁移代码库,可以把这些转换函数封装成独立工具模块,在过渡阶段统一调用。同时,Effect的@effect/data/Either提供了和fp-ts Either几乎一致的操作API(比如map、chain、fold等),可以逐步替换原有fp-ts的Either操作,减少转换的依赖。
内容的提问来源于stack exchange,提问作者cyberixae
相关产品推荐
相关产品推荐

