我有一个返回Either<Error, Task<any>>
的管道,但我需要的是TaskEither<Error, any>
。
如何将Either<Error, Task<any>>
转换为TaskEither<Error, any>
?
有没有辅助工具来执行此操作?
答案 0 :(得分:0)
您可以创建以下转换:
import { Either } from "fp-ts/lib/Either";
import { Task } from "fp-ts/lib/Task";
import { fromEither, rightTask, chain } from "fp-ts/lib/TaskEither";
import { pipe } from "fp-ts/lib/pipeable";
type MyType = { a: string }; // concrete type instead of any for illustration here
declare const t: Either<Error, Task<MyType>>; // your Either flying around somewhere
const result = pipe(
fromEither(t), // returns TaskEither<Error, Task<MyType>>
chain(a => rightTask(a)) // rightTask returns TaskEither<Error, MyType>, chain flattens
);
// result: TaskEither<Error, MyType>
PS:我只想写chain(rightTask)
,但是用这种简写方式不能正确地推断出Error
类型(请注意目前肯定是为什么)。
但是,对于这些强类型而言,这是便宜的价格,并且可以提供您想要的结果!
答案 1 :(得分:0)
解决方案在这里:
https://github.com/gcanti/fp-ts/issues/1072#issuecomment-570207924
declare const a: E.Either<Error, T.Task<unknown>>;
const b: TE.TaskEither<Error, unknown> = E.either.sequence(T.task)(a);