You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:42:18