@@ -90,6 +90,36 @@ export interface DefaultParamsOption {
9090 } ;
9191}
9292
93+ type DeepExact < Actual , Shape > = Actual extends Shape
94+ ? Actual extends readonly ( infer ActualItem ) [ ]
95+ ? Shape extends readonly ( infer ShapeItem ) [ ]
96+ ? readonly DeepExact < ActualItem , ShapeItem > [ ]
97+ : Actual
98+ : Actual extends object
99+ ? Shape extends object
100+ ? { [ K in keyof Actual ] : K extends keyof Shape ? DeepExact < Actual [ K ] , Shape [ K ] > : never }
101+ : Actual
102+ : Actual
103+ : never ;
104+
105+ type ExactOptionProperty < Init extends object , Key extends "params" | "body" , Shape > = Key extends keyof Init
106+ ? { } extends Pick < Init , Key >
107+ ? { [ K in Key ] ?: DeepExact < Exclude < Init [ K ] , undefined > , Shape > | Extract < Init [ K ] , undefined > }
108+ : { [ K in Key ] : DeepExact < Exclude < Init [ K ] , undefined > , Shape > | Extract < Init [ K ] , undefined > }
109+ : { } ;
110+
111+ type ExactParamsAndBody < Init , Operation > = Init extends undefined
112+ ? Init
113+ : Init extends object
114+ ? Omit < Init , "params" | "body" > &
115+ ExactOptionProperty <
116+ Init ,
117+ "params" ,
118+ ParamsOption < Operation > extends { params ?: infer Params } ? Params : never
119+ > &
120+ ExactOptionProperty < Init , "body" , RequestBodyOption < Operation > extends { body ?: infer Body } ? Body : never >
121+ : Init ;
122+
93123export type ParamsOption < T > = T extends {
94124 parameters : any ;
95125}
@@ -208,7 +238,7 @@ export type ClientMethod<
208238 Media extends MediaType ,
209239> = < Path extends PathsWithMethod < Paths , Method > , Init extends MaybeOptionalInit < Paths [ Path ] , Method > > (
210240 url : Path ,
211- ...init : InitParam < Init >
241+ ...init : InitParam < ExactParamsAndBody < Init , FilterKeys < Paths [ Path ] , Method > > >
212242) => Promise < FetchResponse < Paths [ Path ] [ Method ] , Init , Media > > ;
213243
214244export type ClientRequestMethod < Paths extends Record < string , Record < HttpMethod , { } > > , Media extends MediaType > = <
@@ -218,12 +248,12 @@ export type ClientRequestMethod<Paths extends Record<string, Record<HttpMethod,
218248> (
219249 method : Method ,
220250 url : Path ,
221- ...init : InitParam < Init >
251+ ...init : InitParam < ExactParamsAndBody < Init , FilterKeys < Paths [ Path ] , Method > > >
222252) => Promise < FetchResponse < Paths [ Path ] [ Method ] , Init , Media > > ;
223253
224254export type ClientForPath < PathInfo extends Record < string | number , any > , Media extends MediaType > = {
225255 [ Method in keyof PathInfo as Uppercase < string & Method > ] : < Init extends MaybeOptionalInit < PathInfo , Method > > (
226- ...init : InitParam < Init >
256+ ...init : InitParam < ExactParamsAndBody < Init , FilterKeys < PathInfo , Method > > >
227257 ) => Promise < FetchResponse < PathInfo [ Method ] , Init , Media > > ;
228258} ;
229259
0 commit comments