简体   繁体   English

如何在 typescript 中创建一种类型的函数链(数组)?

[英]How to make a type of chain (array) of functions in typescript?

I want to have a type for chain of operators like我想要一种类型的运算符链,例如

Chain<T, U> = [ T => A, A => B, B => C, C => U ];链<T, U> = [ T => A, A => B, B => C, C => U ];

So T should be an input and U should be an output, but in the middle there are can be any transformations.所以 T 应该是输入,U 应该是 output,但中间可以有任何转换。

I wish i can do it like this我希望我能这样做

type Op<T, U> = (data: T, ...args: unknown[]) => U;
type OpChain<T, U> = [] | [ Op<T, U> ] | [ Op<T, infer R>, ...OpChain<R, U> ];

But of coarse it is not working in typescript.但粗略地说,它在 typescript 中不起作用。 Any ideas?有任何想法吗?

The only use case for what such a type could be created is further calling such a chain.可以创建这种类型的唯一用例是进一步调用这种链。 I suggest you create overloads to describe a finite number of signatures.我建议您创建重载来描述有限数量的签名。 I think up to 10 would be enough and may cover all your cases:我认为最多 10 个就足够了,并且可能涵盖您的所有情况:

function callChain<T, U>(input: T, f1: (arg: T) => U): U;
function callChain<T, U, RP1>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => U): U;
function callChain<T, U, RP1, RP2>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => RP2, f3: (arg: RP2) => U): U;
function callChain<T, U, RP1, RP2, RP3>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => RP2, f3: (arg: RP2) => RP3, f4: (arg: RP3) => U): U;
function callChain<T, U, RP1, RP2, RP3, RP4>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => RP2, f3: (arg: RP2) => RP3, f4: (arg: RP3) => RP4, f5: (arg: RP4) => U): U;
function callChain<T, U, RP1, RP2, RP3, RP4, RP5>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => RP2, f3: (arg: RP2) => RP3, f4: (arg: RP3) => RP4, f5: (arg: RP4) => RP5, f6: (arg: RP5) => U): U;
function callChain<T, U, RP1, RP2, RP3, RP4, RP5, RP6>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => RP2, f3: (arg: RP2) => RP3, f4: (arg: RP3) => RP4, f5: (arg: RP4) => RP5, f6: (arg: RP5) => RP6, f7: (arg: RP6) => U): U;
function callChain<T, U, RP1, RP2, RP3, RP4, RP5, RP6, RP7>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => RP2, f3: (arg: RP2) => RP3, f4: (arg: RP3) => RP4, f5: (arg: RP4) => RP5, f6: (arg: RP5) => RP6, f7: (arg: RP6) => RP7, f8: (arg: RP7) => U): U;
function callChain<T, U, RP1, RP2, RP3, RP4, RP5, RP6, RP7, RP8>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => RP2, f3: (arg: RP2) => RP3, f4: (arg: RP3) => RP4, f5: (arg: RP4) => RP5, f6: (arg: RP5) => RP6, f7: (arg: RP6) => RP7, f8: (arg: RP7) => RP8, f9: (arg: RP8) => U): U;
function callChain<T, U, RP1, RP2, RP3, RP4, RP5, RP6, RP7, RP8, RP9>(input: T, f1: (arg: T) => RP1, f2: (arg: RP1) => RP2, f3: (arg: RP2) => RP3, f4: (arg: RP3) => RP4, f5: (arg: RP4) => RP5, f6: (arg: RP5) => RP6, f7: (arg: RP6) => RP7, f8: (arg: RP7) => RP8, f9: (arg: RP8) => RP9, f10: (arg: RP9) => U): U;
function callChain(input: any, ...funcs: ((...args: any[]) => any)[]) {
    return funcs.reduce((input, current) => current(input), input);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM