Skip to content

Commit 7de60f1

Browse files
committed
wip: support overloads in call
1 parent 23af2a9 commit 7de60f1

File tree

1 file changed

+65
-3
lines changed

1 file changed

+65
-3
lines changed

types/index.d.ts

+65-3
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,16 @@ export function putResolve<A extends Action>(
184184
action: A,
185185
): SagaGenerator<A, PutEffect<A>>;
186186

187-
export function call<Fn extends (...args: any[]) => any>(
187+
export function call<
188+
Fn extends (...args: any[]) => any,
189+
Args extends OverloadParameters<Fn>
190+
>(
188191
fn: Fn,
189-
...args: Parameters<Fn>
190-
): SagaGenerator<SagaReturnType<Fn>, CallEffect<SagaReturnType<Fn>>>;
192+
...args: Args
193+
): SagaGenerator<
194+
SagaReturnType<ExtractOverload<Fn, Args>>,
195+
CallEffect<SagaReturnType<ExtractOverload<Fn, Args>>>
196+
>;
191197
export function call<
192198
Ctx extends {
193199
[P in Name]: (this: Ctx, ...args: any[]) => any;
@@ -525,3 +531,59 @@ export function race<T extends { [key: string]: any }>(
525531
{ [K in keyof T]: EffectReturnType<T[K]> | undefined },
526532
RaceEffect<T[keyof T]>
527533
>;
534+
535+
// helpers
536+
537+
type Overloads<Fn extends (...args: any) => any> = Fn extends {
538+
(...args: infer P1): infer R1;
539+
(...args: infer P2): infer R2;
540+
(...args: infer P3): infer R3;
541+
(...args: infer P4): infer R4;
542+
(...args: infer P5): infer R5;
543+
}
544+
? [
545+
(...args: P1) => R1,
546+
(...args: P2) => R2,
547+
(...args: P3) => R3,
548+
(...args: P4) => R4,
549+
(...args: P5) => R5,
550+
]
551+
: Fn extends {
552+
(...args: infer P1): infer R1;
553+
(...args: infer P2): infer R2;
554+
(...args: infer P3): infer R3;
555+
(...args: infer P4): infer R4;
556+
}
557+
? [
558+
(...args: P1) => R1,
559+
(...args: P2) => R2,
560+
(...args: P3) => R3,
561+
(...args: P4) => R4,
562+
]
563+
: Fn extends {
564+
(...args: infer P1): infer R1;
565+
(...args: infer P2): infer R2;
566+
(...args: infer P3): infer R3;
567+
}
568+
? [(...args: P1) => R1, (...args: P2) => R2, (...args: P3) => R3]
569+
: Fn extends {
570+
(...args: infer P1): infer R1;
571+
(...args: infer P2): infer R2;
572+
}
573+
? [(...args: P1) => R1, (...args: P2) => R2]
574+
: [Fn];
575+
576+
type OverloadParameters<Fn extends (...args: any) => any> = Parameters<
577+
Overloads<Fn>[number]
578+
>;
579+
580+
type ExtractOverload<
581+
Fn extends (...args: any) => any,
582+
Args extends any[]
583+
// eslint-disable-next-line @typescript-eslint/ban-types
584+
> = Extract<Overloads<Fn>[number], (...args: Args) => any>;
585+
586+
type OverloadReturnType<
587+
Fn extends (...args: any) => any,
588+
Args extends any[]
589+
> = ReturnType<ExtractOverload<Fn, Args>>;

0 commit comments

Comments
 (0)