Effect CommunityEC
Effect Community3y ago
89 replies
Stephen Bluck

Trouble with types in function overloading

I am playing with function overloading but I can't quite get the types lining up. What am I doing wrong? ( RIO = Effect.Effect)

These are my definitions:
export function getUser<R, E>(self: RIO<R, E, number>): RIO<R | Users | Token, E, string>;
export function getUser<R, E>(id: number): RIO<R | Users | Token, E, string>;

export function getUser<R, E>(arg: RIO<R, E, number> | number): RIO<R | Users | Token, E, string> {
  return isNumber(arg)
    ? Effect.flatMap(Users.Tag, (users) => users.getUser(arg))
    : Effect.flatMap(Users.Tag, (users) => pipe(arg, Effect.flatMap(users.getUser)));
}


This is where I am using it:
export const remixLoader = (args: LoaderArgs): Promise<Response> => pipe(
  Params.get(UserId), // TS Error
  Users.getUser,
  Loader.json(User),
  Loader.authenticated,
  Loader.resolve(args)
)

Argument of type 'RIO<Params, ParseParamsError, number>' is not assignable to parameter of type 'number'.

Which is odd because my getUsers accepts an effect which returns a number...
Was this page helpful?