Using Effect Tags and Layers in TypeScript with Dependencies
I'm stuck about how to follow Effect correctly for this code, when creating the Layers, ctx and convexApi are passed as parameters since i can't import them directly:
class ConvexContext extends Effect.Tag("ConvexContext")<
ConvexContext,
{
runQuery: GenericActionCtx<any>["runQuery"];
runMutation: GenericActionCtx<any>["runMutation"];
runAction: GenericActionCtx<any>["runAction"];
}
>() {}
class DeviceQueries extends Effect.Tag("DeviceQueries")<
DeviceQueries,
typeof api.devices.queries
>() {}
const makeConvexLayer = (ctx: GenericActionCtx<any>) =>
Layer.succeed(ConvexContext, {
runQuery: ctx.runQuery,
runMutation: ctx.runMutation,
runAction: ctx.runAction,
});
const makeQueriesLayer = (convexApi: typeof api) =>
Layer.succeed(DeviceQueries, convexApi.devices.queries);
class GetDeviceByWaIdService extends Effect.Service<GetDeviceByWaIdService>()(
"GetDeviceByWaIdService",
{
effect: Effect.gen(function* (_) {
const convexContext = yield* ConvexContext;
const queries = yield* DeviceQueries;
return {
query: (waId: string) =>
pipe(
Effect.promise(() =>
convexContext.runQuery(queries.getDeviceByWaId, { waId })
),
Effect.flatMap((result) =>
result ? Effect.succeed(result) : Effect.fail("Device not found")
)
),
};
}),
// Error: Property '[LayerTypeId]' is missing in type 'typeof ConvexContext' but required in type 'Any'.
// Error: Property '[LayerTypeId]' is missing in type 'typeof DeviceQueries' but required in type 'Any'.
dependencies: [ConvexContext, DeviceQueries],
}
) {}class ConvexContext extends Effect.Tag("ConvexContext")<
ConvexContext,
{
runQuery: GenericActionCtx<any>["runQuery"];
runMutation: GenericActionCtx<any>["runMutation"];
runAction: GenericActionCtx<any>["runAction"];
}
>() {}
class DeviceQueries extends Effect.Tag("DeviceQueries")<
DeviceQueries,
typeof api.devices.queries
>() {}
const makeConvexLayer = (ctx: GenericActionCtx<any>) =>
Layer.succeed(ConvexContext, {
runQuery: ctx.runQuery,
runMutation: ctx.runMutation,
runAction: ctx.runAction,
});
const makeQueriesLayer = (convexApi: typeof api) =>
Layer.succeed(DeviceQueries, convexApi.devices.queries);
class GetDeviceByWaIdService extends Effect.Service<GetDeviceByWaIdService>()(
"GetDeviceByWaIdService",
{
effect: Effect.gen(function* (_) {
const convexContext = yield* ConvexContext;
const queries = yield* DeviceQueries;
return {
query: (waId: string) =>
pipe(
Effect.promise(() =>
convexContext.runQuery(queries.getDeviceByWaId, { waId })
),
Effect.flatMap((result) =>
result ? Effect.succeed(result) : Effect.fail("Device not found")
)
),
};
}),
// Error: Property '[LayerTypeId]' is missing in type 'typeof ConvexContext' but required in type 'Any'.
// Error: Property '[LayerTypeId]' is missing in type 'typeof DeviceQueries' but required in type 'Any'.
dependencies: [ConvexContext, DeviceQueries],
}
) {}