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

fp-ts中如何串联多Either与Promise操作?新手求助

解决fp-ts中Either与Promise串联的类型错误

你遇到的类型错误核心是either.chain的约束:它只接受返回同步Either的函数,但你的validateUserWithToken返回的是Promise<Either<Error, void>>(异步包装的Either),两者类型不兼容。

解决方案:用TaskEither统一同步/异步操作上下文

TaskEither是fp-ts专门处理「可能失败的异步操作」的类型,本质是Task<Either<E, A>>,完美适配你的场景。以下是修正后的实现:

修改后的代码

import { Request } from 'express';
import { either, taskEither } from 'fp-ts';
import { pipe } from 'fp-ts/lib/function';

// * Parse the token
declare const parseRawToken: (rawToken: string | undefined) => either.Either<Error, string>;

// * 原类型定义可保留,后续适配异步逻辑
type MakeIsRequestAuthenticated = (
  validateUserWithToken: (data: string) => Promise<either.Either<Error, void>>,
) => (request: Request) => Promise<either.Either<Error, void>>;

export const makeIsRequestAuthenticated: MakeIsRequestAuthenticated = validateUserWithToken => {
  return request => pipe(
    // 1. 解析Token(同步Either结果)
    parseRawToken(request.header('Authorization')),
    // 2. 将同步Either提升到TaskEither上下文
    taskEither.fromEither,
    // 3. 串联异步验证:把Promise转为TaskEither后用chain连接
    taskEither.chain(token => taskEither.fromPromise(() => validateUserWithToken(token))),
    // 4. 执行TaskEither,返回最终的Promise<Either>
    taskEither.run
  );
};

关键逻辑说明

  1. 提升同步结果:用taskEither.fromEither把parseRawToken的同步Either结果,转换为TaskEither类型,让它能和异步操作在同一上下文串联。
  2. 适配异步函数:taskEither.fromPromise可以直接把返回Promise<Either>的函数,转换为返回TaskEither的函数,满足taskEither.chain的参数要求。
  3. 统一串联操作:全程使用taskEither.chain而非either.chain,确保所有操作都在TaskEither的异步失败上下文里执行。

为什么之前用TaskEither没解决?

大概率是你没有把同步Either提升到TaskEither上下文,或者误用了either.chain(同步链)而非taskEither.chain(异步链)。必须保证所有串联操作处于同一个上下文,不能混合两种chain方法。

内容的提问来源于stack exchange,提问作者Puszkarek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:25:48