在ReaderTaskEither中调用返回TaskEither的函数时类型不匹配求助
问题解决:ReaderTaskEither 调用 TaskEither 函数的类型匹配问题
你的代码问题出在 RTE.fromTaskEither 的类型推断上。fromTaskEither 默认会将 ReaderTaskEither 的环境类型推断为 unknown,但链操作需要环境类型保持为 Env,导致类型不匹配。
修复方案一:显式指定 fromTaskEither 的类型参数
给 RTE.fromTaskEither 传入环境、错误、结果的类型参数,明确告知类型系统当前环境为 Env:
import * as E from "fp-ts/Either"; import * as RTE from "fp-ts/ReaderTaskEither"; import * as TE from "fp-ts/TaskEither"; import { pipe } from "fp-ts/function"; type Env = { arid: string }; const getValues = (id: string): TE.TaskEither<Error, number[]> => TE.fromEither(E.right([])); class Result { constructor(public values: number[]) {} } export function sut(): RTE.ReaderTaskEither<Env, Error, Result> { return pipe( RTE.ask<Env, Error>(), RTE.chain((env) => pipe( getValues(env.arid), TE.map((e) => new Result(e)), // 显式指定类型参数,匹配环境类型 RTE.fromTaskEither<Env, Error, Result> ) ) ); }
修复方案二:柯里化调用 fromTaskEither(更简洁)
利用 fromTaskEither 的柯里化特性,直接传入转换后的 TaskEither 实例并指定类型:
export function sut(): RTE.ReaderTaskEither<Env, Error, Result> { return pipe( RTE.ask<Env, Error>(), RTE.chain((env) => RTE.fromTaskEither<Env, Error, Result>( pipe(getValues(env.arid), TE.map(e => new Result(e))) ) ) ); }
核心原因
TaskEither 本身不依赖环境上下文,而 ReaderTaskEither 绑定了环境类型。使用 fromTaskEither 转换时,必须明确指定转换后的 ReaderTaskEither 接受的环境类型(这里无需使用环境,只要指定为 Env 即可匹配链上的类型约束)。
内容的提问来源于stack exchange,提问作者Damien Sawyer
相关产品推荐
相关产品推荐

