@@ -184,10 +184,16 @@ export function putResolve<A extends Action>(
184
184
action : A ,
185
185
) : SagaGenerator < A , PutEffect < A > > ;
186
186
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
+ > (
188
191
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
+ > ;
191
197
export function call <
192
198
Ctx extends {
193
199
[ P in Name ] : ( this : Ctx , ...args : any [ ] ) => any ;
@@ -525,3 +531,59 @@ export function race<T extends { [key: string]: any }>(
525
531
{ [ K in keyof T ] : EffectReturnType < T [ K ] > | undefined } ,
526
532
RaceEffect < T [ keyof T ] >
527
533
> ;
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