TypeScript中pipe与compose函数的类型推断不准确问题
TypeScript中pipe与compose函数的类型推断不准确问题
嘿,我来帮你捋捋这个问题~
问题1:是语言限制还是写法问题?
这不是TypeScript的语言限制,问题出在你泛型参数的声明时机上。你把X、Y、Z三个泛型参数都放在了最外层函数上,当你调用第一个函数(比如pipe(firstFn))的时候,TypeScript就会尝试立刻推断出X和Y,但此时第二个函数还没传入,这就可能导致后续传入第二个函数时,类型推断出现偏差——毕竟TypeScript没法提前知道你第二个函数的参数和返回值类型嘛。
问题2:怎么修复类型推断问题?
我们需要把泛型参数拆分到柯里化的每一层函数中,让TypeScript能在每一步调用时逐步推断类型,而不是一开始就强行确定所有泛型。调整后的代码如下:
修复后的pipe函数
function pipe<X, Y>(first: (x: X) => Y) { return function<Z>(second: (y: Y) => Z): (x: X) => Z { return function(x: X): Z { return second(first(x)); }; }; }
修复后的compose2函数
function compose2<Y, Z>(second: (y: Y) => Z) { return function<X>(first: (x: X) => Y): (x: X) => Z { return function(x: X): Z { return second(first(x)); }; }; }
这样调整后,当你调用pipe(firstFn)时,TypeScript会先推断出X和Y;当你接着传入第二个函数时,再推断出Z,就能完美实现强类型的函数组合了。举个使用例子验证下:
// 示例函数 const add1 = (num: number) => num + 1; const toString = (val: number) => val.toString(); // 使用pipe const add1ThenToString = pipe(add1)(toString); // 此时add1ThenToString的类型会被正确推断为 (x: number) => string const result1 = add1ThenToString(5); // 类型是string,值为"6" // 使用compose2 const toStringAfterAdd1 = compose2(toString)(add1); // 类型同样被正确推断为 (x: number) => string const result2 = toStringAfterAdd1(10); // 类型是string,值为"11"
这样修改后,类型推断就完全准确啦,而且保持了函数的柯里化特性和泛型通用性。
备注:内容来源于stack exchange,提问作者Igor Soloydenko
相关产品推荐
相关产品推荐

