|
| 1 | +ramdaToolsNoInfinite.ts(115,27): error TS2370: A rest parameter must be of an array type. |
| 2 | + |
| 3 | + |
| 4 | +==== ramdaToolsNoInfinite.ts (1 errors) ==== |
| 5 | + // All the following types are explained here: |
| 6 | + // https://medium.freecodecamp.org/typescript-curry-ramda-types-f747e99744ab |
| 7 | + // https://github.com/pirix-gh/medium/blob/master/types-curry-ramda/src/index.ts |
| 8 | + declare namespace Tools { |
| 9 | + type Head<T extends any[]> = |
| 10 | + T extends [any, ...any[]] |
| 11 | + ? T[0] |
| 12 | + : never; |
| 13 | + |
| 14 | + type Tail<T extends any[]> = |
| 15 | + ((...t: T) => any) extends ((_: any, ...tail: infer TT) => any) |
| 16 | + ? TT |
| 17 | + : []; |
| 18 | + |
| 19 | + type HasTail<T extends any[]> = |
| 20 | + T extends ([] | [any]) |
| 21 | + ? false |
| 22 | + : true; |
| 23 | + |
| 24 | + type Last<T extends any[]> = { |
| 25 | + 0: Last<Tail<T>>; |
| 26 | + 1: Head<T>; |
| 27 | + }[ |
| 28 | + HasTail<T> extends true |
| 29 | + ? 0 |
| 30 | + : 1 |
| 31 | + ]; |
| 32 | + |
| 33 | + type Length<T extends any[]> = |
| 34 | + T['length']; |
| 35 | + |
| 36 | + type Prepend<E, T extends any[]> = |
| 37 | + ((head: E, ...args: T) => any) extends ((...args: infer U) => any) |
| 38 | + ? U |
| 39 | + : T; |
| 40 | + |
| 41 | + type Drop<N extends number, T extends any[], I extends any[] = []> = { |
| 42 | + 0: Drop<N, Tail<T>, Prepend<any, I>>; |
| 43 | + 1: T; |
| 44 | + }[ |
| 45 | + Length<I> extends N |
| 46 | + ? 1 |
| 47 | + : 0 |
| 48 | + ]; |
| 49 | + |
| 50 | + type Cast<X, Y> = X extends Y ? X : Y; |
| 51 | + |
| 52 | + type Pos<I extends any[]> = |
| 53 | + Length<I>; |
| 54 | + |
| 55 | + type Next<I extends any[]> = |
| 56 | + Prepend<any, I>; |
| 57 | + |
| 58 | + type Prev<I extends any[]> = |
| 59 | + Tail<I>; |
| 60 | + |
| 61 | + type Iterator<Index extends number = 0, From extends any[] = [], I extends any[] = []> = { |
| 62 | + 0: Iterator<Index, Next<From>, Next<I>>; |
| 63 | + 1: From; |
| 64 | + }[ |
| 65 | + Pos<I> extends Index |
| 66 | + ? 1 |
| 67 | + : 0 |
| 68 | + ]; |
| 69 | + |
| 70 | + type Reverse<T extends any[], R extends any[] = [], I extends any[] = []> = { |
| 71 | + 0: Reverse<T, Prepend<T[Pos<I>], R>, Next<I>>; |
| 72 | + 1: R; |
| 73 | + }[ |
| 74 | + Pos<I> extends Length<T> |
| 75 | + ? 1 |
| 76 | + : 0 |
| 77 | + ]; |
| 78 | + |
| 79 | + type Concat<T1 extends any[], T2 extends any[]> = |
| 80 | + Reverse<Reverse<T1> extends infer R ? Cast<R, any[]> : never, T2>; |
| 81 | + |
| 82 | + type Append<E, T extends any[]> = |
| 83 | + Concat<T, [E]>; |
| 84 | + |
| 85 | + type ValueOfRecord<R> = R extends Record<any, infer T> ? T : never; |
| 86 | + } |
| 87 | + |
| 88 | + declare namespace R { |
| 89 | + export type Placeholder = { __placeholder: void }; |
| 90 | + } |
| 91 | + |
| 92 | + declare namespace Curry { |
| 93 | + type GapOf<T1 extends any[], T2 extends any[], TN extends any[], I extends any[]> = |
| 94 | + T1[Tools.Pos<I>] extends R.Placeholder |
| 95 | + ? Tools.Append<T2[Tools.Pos<I>], TN> |
| 96 | + : TN; |
| 97 | + |
| 98 | + interface GapsOfWorker<T1 extends any[], T2 extends any[], TN extends any[] = [], I extends any[] = []> { |
| 99 | + 0: GapsOf<T1, T2, GapOf<T1, T2, TN, I> extends infer G ? Tools.Cast<G, any[]> : never, Tools.Next<I>>; |
| 100 | + 1: Tools.Concat<TN, Tools.Drop<Tools.Pos<I>, T2> extends infer D ? Tools.Cast<D, any[]> : never>; |
| 101 | + } |
| 102 | + type GapsOf<T1 extends any[], T2 extends any[], TN extends any[] = [], I extends any[] = []> = GapsOfWorker<T1, T2, TN, I>[ |
| 103 | + Tools.Pos<I> extends Tools.Length<T1> |
| 104 | + ? 1 |
| 105 | + : 0 |
| 106 | + ]; |
| 107 | + |
| 108 | + type PartialGaps<T extends any[]> = { |
| 109 | + [K in keyof T]?: T[K] | R.Placeholder |
| 110 | + }; |
| 111 | + |
| 112 | + type CleanedGaps<T extends any[]> = { |
| 113 | + [K in keyof T]: NonNullable<T[K]> |
| 114 | + }; |
| 115 | + |
| 116 | + type Gaps<T extends any[]> = CleanedGaps<PartialGaps<T>>; |
| 117 | + |
| 118 | + type Curry<F extends ((...args: any) => any)> = |
| 119 | + <T extends any[]>(...args: Tools.Cast<Tools.Cast<T, Gaps<Parameters<F>>>, any[]>) => |
| 120 | + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 121 | +!!! error TS2370: A rest parameter must be of an array type. |
| 122 | + GapsOf<T, Parameters<F>> extends [any, ...any[]] |
| 123 | + ? Curry<(...args: GapsOf<T, Parameters<F>> extends infer G ? Tools.Cast<G, any[]> : never) => ReturnType<F>> |
| 124 | + : ReturnType<F>; |
| 125 | + } |
| 126 | + |
0 commit comments