0

我对 FP-TS(或一般的函数式编程)还不是很满意,所以我可能在这里做错了一些事情。

我有以下函数,我想返回 aTaskEither<Errors, Job>但我似乎无法让它工作。

这个返回Promise<Either<Errors, Job>>

export function storeJob(job: CreateJob): TaskEither<Errors, Job> {
  const dto = toCreateDto(job)
  const insertQuery = createInsertQuery('jobs')(dto)

  return pipe(
      insertQuery, // string
      query, // TaskEither<Error, unknown>
      fromEither(fromDto(dto) // Either<Errors, Job> ) // TaskEither<Errors, Job> 
  ) // Promise<Either<Errors, Job>>
}

再次尝试(仅更改了最后一个管道,添加map)我确实返回TaskEither<Error, TaskEither<Errors, Job>>

export function storeJob(job: CreateJob): TaskEither<Errors, Job> {
  const dto = toCreateDto(job)
  const insertQuery = createInsertQuery('jobs')(dto)

  return pipe(
      insertQuery, // string
      query, // TaskEither<Error, unknown>
      map(() => fromEither(fromDto(dto) // Either<Errors, Job> ))
  ) // TaskEither<Error, TaskEither<Errors, Job>>
}

对于之后的第二个,flatten在地图之后添加一个似乎也不起作用。

4

1 回答 1

0

因此,似乎在问题中。left管道中的一个值是Error,另一个是Errors。这意味着有两条路径可以返回不同的左值。为了更清楚。我将 Errors 更改为 type ValidationErrors。并且曾经chainW能够在一个管道中合并多个左错误。最终导致:

export function storeJob(job: CreateJob): TaskEither<Error | ValidationErrors, Job> {
  const dto = toCreateDto(job)
  const insertQuery = createInsertQuery('jobs')(dto)

  return pipe(
      insertQuery,
      query,
      T.chainW(() => T.fromEither(fromDto(dto)))
  )
}
于 2021-04-23T19:41:34.430 回答