TypeScript 3.7递归类型给出;类型实例化太深,可能是无限的;

TypeScript 3.7递归类型给出;类型实例化太深,可能是无限的;,typescript,functional-programming,Typescript,Functional Programming,我试图编写一个可变的管道函数,它由任意数量的单参数纯函数组成。 这种类型应该检查一个函数的返回类型是否是下一个函数的参数类型,依此类推 我希望这在TypeScript 3.7中能起作用,它引入了递归类型,但不知何故它不起作用,并给出了错误: TS2589:类型实例化太深,可能是无限的 这是我的密码: type Tail<T extends any[]> = ((...t: T) => void) extends ((x: any, ...u: infer U) => vo

我试图编写一个可变的
管道
函数,它由任意数量的单参数纯函数组成。 这种类型应该检查一个函数的返回类型是否是下一个函数的参数类型,依此类推

我希望这在TypeScript 3.7中能起作用,它引入了递归类型,但不知何故它不起作用,并给出了错误:

TS2589:类型实例化太深,可能是无限的

这是我的密码:

type Tail<T extends any[]> = ((...t: T) => void) extends ((x: any, ...u: infer U) => void) ? U : never;

type Pipe<FNS extends unknown[]> = FNS extends [(a: infer A) => infer B, (b: infer B) => infer C] ? C :
                                 FNS extends [(a: infer A) => infer B, (b: infer B) => infer C, Pipe<[...Tail<FNS>[]]>] ? C : never;
错误在这一部分:

Pipe<[...Tail<FNS>[]]>
管道

为什么这是无限的?我遗漏了什么?

可变类型是未来的,而不是3.7的一部分

这是一个备受期待的特性,它将真正支持中的函数式编程


Typescript

I通过将
Pipe
的定义更改为:
type Pipe=FNS extends[(a:infera)=>inferb,(B:inferb)=>inferc]?C:FNS扩展[(a:推断a)=>推断B,(B:推断B)=>推断C,管道]?C:从来没有
但是它的计算结果是
从不
而不是
字符串
,因此输入不正确:
类型Foo=Pipe类型脚本3.7是测试版。我不是说这是原因,但是为什么你要使用一个还没有正式发布的版本呢?出于测试目的?我自己没有试图重现错误,但如果它是一个bug,请让开发人员知道。@jperl yes出于测试目的。。。
Pipe<[...Tail<FNS>[]]>