@@ -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+ > ;
191197export function call <
192198 Ctx extends {
193199 [ P in Name ] : ( this : Ctx , ...args : any [ ] ) => any ;
@@ -525,3 +531,66 @@ 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 > > ;
590+
591+ declare function testFunc ( a : 1 ) : "1" ;
592+ declare function testFunc ( a : { foo : number } ) : "4" ;
593+ declare function testFunc ( a : 2 ) : "2" ;
594+ declare function testFunc ( a : 3 ) : "3" ;
595+
596+ type t = OverloadReturnType < typeof testFunc , [ { foo : 1 } ] > ;
0 commit comments