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 ); };
关键逻辑说明
- 提升同步结果:用
taskEither.fromEither把parseRawToken的同步Either结果,转换为TaskEither类型,让它能和异步操作在同一上下文串联。 - 适配异步函数:
taskEither.fromPromise可以直接把返回Promise<Either>的函数,转换为返回TaskEither的函数,满足taskEither.chain的参数要求。 - 统一串联操作:全程使用
taskEither.chain而非either.chain,确保所有操作都在TaskEither的异步失败上下文里执行。
为什么之前用TaskEither没解决?
大概率是你没有把同步Either提升到TaskEither上下文,或者误用了either.chain(同步链)而非taskEither.chain(异步链)。必须保证所有串联操作处于同一个上下文,不能混合两种chain方法。
内容的提问来源于stack exchange,提问作者Puszkarek
相关产品推荐
相关产品推荐

