Inferring Service Types in Effect Handler Wrapper

Hello there,

I'm trying to create a wrapper (effectHandler) for more convenient usage of single-purpose services in cli:

import { Effect } from "effect"

class MyRequirement extends Effect.Service<MyRequirement>()("MyRequirement", { succeed: () => 42 }) {}

class MyUseCase extends Effect.Service<MyUseCase>()("MyUseCase", {
  dependencies: [MyRequirement.Default],
  effect: Effect.gen(function*() {
    const requirement = yield* MyRequirement
    return Effect.fn("MyUseCase.execute")(function*() {
      return requirement()
    })
  })
}) {}

function effectHandler<
  Errors,
  Requirements,
  Args extends unknown[],
  Service extends Effect.Effect<
    (...args: Args) => Effect.Effect<void, Errors, Requirements>,
    Errors,
    Requirements
  >
>(
  service: Service
): (...args: Args) => Effect.Effect<void, Errors, Requirements> {
  return Effect.fn("effectHandler")(function*(...args: Args) {
    const execute = yield* service
    yield* execute(...args)
  })
}

const program = effectHandler(MyUseCase)


it works, but the Errors and
Requirements
types are lost in the process. Is there a better way to infer Service types?

https://effect.website/play/#fe5858f24443
Was this page helpful?