从任意数量的闭包中获取最后一个函数的类型

时间:2020-08-26 03:20:57

标签: typescript

考虑一个功能:

-32768

如何在不知道闭包总数的情况下仅获取最后一个函数const f = a => b => ... x => { return somevalue } 的类型?

我最初的想法是,我们需要构建一个使用递归和条件类型检查的类型,直到到达终点为止。但是,我不确定typescript是否支持此类问题的递归类型。

1 个答案:

答案 0 :(得分:4)

Recursive conditional types将在TypeScript 4.1中支持。目前,它在typescript@next中可用。然后,您将可以编写类似

的内容
type LastFunc<T extends (...args: any) => any> =
    T extends (...args: any) => infer R ? 
    R extends (...args: any) => any ? LastFunc<R> : T : never;

并在您的f函数上使用它:

declare const somevalue: SomeValue;
const f = (a: any) => (b: any) => (c: any) => (d: any) => (x: any) => { return somevalue }
type LastFuncF = LastFunc<typeof f>; // type LastFuncF = (x: any) => SomeValue

Playground link to code


在此之前,您可以使用不受支持的解决方法来获得此行为,例如以下令人困惑和烦人的延迟对象查找操作:

type LastFunc<T extends (...args: any) => any> =
    T extends (...args: any) => infer R ? {
        0: LastFunc<Extract<R, (...args: any) => any>>, 1: T
    }[R extends (...args: any) => any ? 0 : 1] : never

或者您可以通过将循环展开到固定深度来仅使用受支持的功能,这既多余又烦人:

type LastFunc<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF0<R> : T : never;
type LF0<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF1<R> : T : never;
type LF1<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF2<R> : T : never;
type LF2<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF3<R> : T : never;
type LF3<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF4<R> : T : never;
type LF4<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF5<R> : T : never;
type LF5<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF6<R> : T : never;
type LF6<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF7<R> : T : never;
type LF7<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF8<R> : T : never;
type LF8<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LF9<R> : T : never;
type LF9<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? LFX<R> : T : never;
type LFX<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends (...args: any) => any ? R : T : never;

Playground link to code


就我个人而言,我个人要等到TS4.1。好吧,希望能有所帮助;祝你好运!

相关问题