I have function that can receive object that have multiple arrays of functions that will using like functions for pipe
I find generic that can validate that functions in pipe have compatible types but I still search method for make possible that this array of pipe will more that one in function
This is function that should validate that each output coincide with next input
type Chain<T extends any[], A extends ((x: any) => any)[] = []> =
T extends [infer T0, infer T1, ...infer TR] ? Chain<[T1, ...TR], [...A, ((e: T0) => T1)]> : A;
function hooks<A, B>(args: Chain<[A, B]>): Chain<[A, B]>;
function hooks<A, B, C>(args: Chain<[A, B, C]>): Chain<[A, B, C]>;
function hooks<A, B, C, D>(args: Chain<[A, B, C, D]>): Chain<[A, B, C, D]>;
function hooks<A, B, C, D, E>(args: Chain<[A, B, C, D, E]>): Chain<[A, B, C, D, E]>;
function hooks<A, B, C, D, E, F>(args: Chain<[A, B, C, D, E, F]>): Chain<[A, B, C, D, E, F]>;
function hooks<A, B, C, D, E, F, G>(args: Chain<[A, B, C, D, E, F, G]>): Chain<[A, B, C, D, E, F, G]>;
function hooks<A, B, C, D, E, F, G, H>(args: Chain<[A, B, C, D, E, F, G, H]>): Chain<[A, B, C, D, E, F, G, H]>;
function hooks<A, B, C, D, E, F, G, H, I>(args: Chain<[A, B, C, D, E, F, G, H, I]>): Chain<[A, B, C, D, E, F, G, H, I]>;
function hooks<A, B, C, D, E, F, G, H, I, J>(args: Chain<[A, B, C, D, E, F, G, H, I, J]>): Chain<[A, B, C, D, E, F, G, H, I, J]>;
function hooks<A, B, C, D, E, F, G, H, I, J, K>(args: Chain<[A, B, C, D, E, F, G, H, I, J, K]>): Chain<[A, B, C, D, E, F, G, H, I, J, K]>;
function hooks(args: any) {
return args;
}
And this is main goal
function use<
A, B, C, D, E, F, G, H, I, J, K,
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1,
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2,
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3
>(data: {
before?: typeof hooks<A, B, C, D, E, F, G, H, I, J, K>,
after?: typeof hooks<A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1>,
some?: typeof hooks<A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2>,
each?: typeof hooks<A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3>,
}) {
return data;
}
const a = use({
before: [
(e: number) => e,
(e) => e,
],
after: [
(e: string[]) => e[0],
(e) => e.length,
e => e * 5
e => e.toString(),
e => e.window /// ts should show error
]
})