|
13 | 13 | */
|
14 | 14 | // This is typed in TS file because otherwise TS unifies on the first parameter
|
15 | 15 | // regardless of number of parameters function has.
|
16 |
| -export type APIWithExtraOptions<API extends (...args: any[]) => any, Extra> = |
17 |
| - (...args: WithExtendedOptions<Parameters<API>, Extra>) => ReturnType<API> |
| 16 | +export interface APIWithExtraOptions<API extends (...args: any[]) => any, Extra> { (...args: WithExtendedOptions<Parameters<API>, Extra>): ReturnType<API> } |
18 | 17 |
|
19 | 18 | type End = never[]
|
20 | 19 | type WithExtendedOptions<Params, Ext> = Params extends [...End]
|
21 | 20 | ? []
|
22 | 21 | // (options?: Options) -> (options?: Options & Ext)
|
23 | 22 | : Params extends [options?: infer Options, ...end: End]
|
24 |
| - ? [options?: Options & Ext] |
| 23 | + ? [options?: Options & Ext] |
25 | 24 | // (a: A1, options?: Options) -> (a1: A1, options?: Options & Ext)
|
26 |
| - : Params extends [a1: infer A1, options?: infer Options, ...end: End] |
27 |
| - ? [a1: A1, options?: Options & Ext] |
28 |
| - // (a1?: A1, options?: Options) -> (a1?: A1, options?: Options & Ext) |
29 |
| - : Params extends [a1?: infer A1, options?: infer Options, ...end: End] |
30 |
| - ? [a1?: A1, options?: Options & Ext] |
31 |
| - // (a1: A1, a2: A2, options?: Options) -> (a1: A1, a2: A2 options?: Options & Ext) |
32 |
| - : Params extends [a1: infer A1, a2: infer A2, options?: infer Options, ...end: End] |
33 |
| - ? [a1: A1, a2: A2, options?: Options & Ext] |
34 |
| - // (a1: A1, a2?: A2, options?: Options) -> (a1: A1, a2?: A2 options?: Options & Ext) |
35 |
| - : Params extends [a1: infer A1, a2?: infer A2, options?: infer Options, ...end: End] |
36 |
| - ? [a1: A1, a2?: A2, options?: Options & Ext] |
37 |
| - // (a1: A1, a2?: A2, options?: Options) -> (a1: A1, a2?: A2 options?: Options & Ext) |
38 |
| - : Params extends [a1?: infer A1, a2?: infer A2, options?: infer Options, ...end: End] |
39 |
| - ? [a1?: A1, a2?: A2, options?: Options & Ext] |
40 |
| - // (a1: A1, a2: A2, a3:A3 options?: Options) -> (a1: A1, a2: A2, a3:A3, options?: Options & Ext) |
41 |
| - : Params extends [a1: infer A1, a2: infer A2, a3:infer A3, options?: infer Options, ...end: End] |
42 |
| - ? [a1: A1, a2: A2, a3: A3, options?: Options & Ext] |
43 |
| - // (a1: A1, a2: A2, a3?:A3 options?: Options) -> (a1: A1, a2: A2, a3?:A3, options?: Options & Ext) |
44 |
| - : Params extends [a1: infer A1, a2:infer A2, a3?: infer A3, options?: infer Options, ...end: End] |
45 |
| - ? [a1: A1, a2: A2, a3?: A3, options?: Options & Ext] |
46 |
| - // (a1: A1, a2?: A2, a3?:A3 options?: Options) -> (a1: A1, a2?: A2, a3?:A3, options?: Options & Ext) |
47 |
| - : Params extends [a1: infer A1, a2?: infer A2, a3?: infer A3, options?: infer Options, ...end: End] |
48 |
| - ? [a1: A1, a2?: A2, a3?: A3, options?: Options & Ext] |
49 |
| - // (a1?: A1, a2?: A2, a3?:A3 options?: Options) -> (a1?: A1, a2?: A2, a3?:A3, options?: Options & Ext) |
50 |
| - : Params extends [a1?: infer A1, a2?: infer A2, a3?: infer A3, options?: infer Options, ...end: End] |
51 |
| - ? [a1?: A1, a2?: A2, a3?: A3, options?: Options & Ext] |
52 |
| - : never |
| 25 | + : Params extends [a1: infer A1, options?: infer Options, ...end: End] |
| 26 | + ? [a1: A1, options?: Options & Ext] |
| 27 | + // (a1?: A1, options?: Options) -> (a1?: A1, options?: Options & Ext) |
| 28 | + : Params extends [a1?: infer A1, options?: infer Options, ...end: End] |
| 29 | + ? [a1?: A1, options?: Options & Ext] |
| 30 | + // (a1: A1, a2: A2, options?: Options) -> (a1: A1, a2: A2 options?: Options & Ext) |
| 31 | + : Params extends [a1: infer A1, a2: infer A2, options?: infer Options, ...end: End] |
| 32 | + ? [a1: A1, a2: A2, options?: Options & Ext] |
| 33 | + // (a1: A1, a2?: A2, options?: Options) -> (a1: A1, a2?: A2 options?: Options & Ext) |
| 34 | + : Params extends [a1: infer A1, a2?: infer A2, options?: infer Options, ...end: End] |
| 35 | + ? [a1: A1, a2?: A2, options?: Options & Ext] |
| 36 | + // (a1: A1, a2?: A2, options?: Options) -> (a1: A1, a2?: A2 options?: Options & Ext) |
| 37 | + : Params extends [a1?: infer A1, a2?: infer A2, options?: infer Options, ...end: End] |
| 38 | + ? [a1?: A1, a2?: A2, options?: Options & Ext] |
| 39 | + // (a1: A1, a2: A2, a3:A3 options?: Options) -> (a1: A1, a2: A2, a3:A3, options?: Options & Ext) |
| 40 | + : Params extends [a1: infer A1, a2: infer A2, a3:infer A3, options?: infer Options, ...end: End] |
| 41 | + ? [a1: A1, a2: A2, a3: A3, options?: Options & Ext] |
| 42 | + // (a1: A1, a2: A2, a3?:A3 options?: Options) -> (a1: A1, a2: A2, a3?:A3, options?: Options & Ext) |
| 43 | + : Params extends [a1: infer A1, a2:infer A2, a3?: infer A3, options?: infer Options, ...end: End] |
| 44 | + ? [a1: A1, a2: A2, a3?: A3, options?: Options & Ext] |
| 45 | + // (a1: A1, a2?: A2, a3?:A3 options?: Options) -> (a1: A1, a2?: A2, a3?:A3, options?: Options & Ext) |
| 46 | + : Params extends [a1: infer A1, a2?: infer A2, a3?: infer A3, options?: infer Options, ...end: End] |
| 47 | + ? [a1: A1, a2?: A2, a3?: A3, options?: Options & Ext] |
| 48 | + // (a1?: A1, a2?: A2, a3?:A3 options?: Options) -> (a1?: A1, a2?: A2, a3?:A3, options?: Options & Ext) |
| 49 | + : Params extends [a1?: infer A1, a2?: infer A2, a3?: infer A3, options?: infer Options, ...end: End] |
| 50 | + ? [a1?: A1, a2?: A2, a3?: A3, options?: Options & Ext] |
| 51 | + : never |
53 | 52 |
|
54 | 53 | export type APIMethodWithExtraOptions <
|
55 | 54 | API,
|
56 | 55 | Key extends keyof API,
|
57 | 56 | Extra
|
58 |
| - > = API[Key] extends (...args: any[]) => any ? APIWithExtraOptions<API[Key], Extra> : never |
| 57 | +> = API[Key] extends (...args: any[]) => any ? APIWithExtraOptions<API[Key], Extra> : never |
0 commit comments