我正在尝试编写一个可变参数pipe
函数,该函数由任意数量的单参数纯函数组成。 此类型应检查一个函数的返回类型是否为下一个函数的参数类型,依此类推。
我希望这在 TypeScript 3.7 中有效,它引入了递归类型,但不知何故它不起作用并给出错误:
TS2589: type instantiation is excessively deep and possibly infinite
这是我的代码:
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;
FNS
类型表示纯函数数组,Tail
类型应确保只返回此数组的尾部,但编译器仍将其标记为无限循环。
使用示例:
const numToString = (n: number): string => n.toString();
const toUpper = (s: string): string => s.toUpperCase();
// this works, Foo evaluates to string
type Foo = Pipe<[typeof numToString, typeof toUpper]>;
// this doesn't work, Foo is not evaluated
type Foo = Pipe<[typeof numToString, typeof toUpper, typeof toUpper]>;
错误出在这一部分:
Pipe<[...Tail<FNS>[]]>
为什么这是无限的?我错过了什么?
可变参数类型是未来的路线图,而不是 3.7 的一部分。
这是一个备受期待的功能,它将真正实现函数式编程
打字稿 https://github.com/Microsoft/TypeScript/issues/5453