繁体   English   中英

为什么TypeScript不推断某些管道函数的类型?

[英]Why does TypeScript not infer types for some piped functions?

更新2018年2月20日: 在GitHub上发布此问题

2月28日更新:关闭该问题,转而支持问题。

在下面的代码片段中,如果查看最后两行,TypeScript会在第一行中显示错误,并在第二行中正确推断类型,尽管差异只是函数通过管道传递的顺序。

const pipe = <A, B, C>(
  x: A,
  a: (x: A) => B, 
  b: (x: B) => C,
) => b(a(x));

// This just calls the function passed as argument.
const call = <A, B>(f: (x: A) => B) => (x: A) => f(x)

const a = pipe(1, x => x + 1, call(x => x + 1));
const b = pipe(1, call(x => x + 1), x => x + 1);

我在严格模式下使用TypeScript 2.7.1(包括strictFunctionTypes),但严格模式似乎并不重要。 这是TypeScript操场上的这个片段

这是我在使用RxJS时遇到的一个问题,因为在RxJS中有一个类似的pipe方法,我在使用创建运算符时传递箭头函数(如obs => merge(obs, otherObs) )。 通常通过指定参数类型很容易解决这个问题,但我想了解这背后的逻辑。 为什么TypeScript能够在一种情况下推断出类型但在另一种情况下却不能推断?

这个问题仍然很突出,但是现在我想发布一个我想出的解决方法,因为我发现它在我的经验中非常有用。

创建这样的实用程序函数:

export const call = <A, B>(f: (x: A) => B) => f;

(与问题中的函数相同,一个将一元函数作为参数的标识函数),然后每当您在管道中遇到箭头函数的问题时,请尝试使用此实用程序函数将其括起来。 违反直觉,TS不能处理这个问题:

const a = pipe(1, x => x + 1, call(x => x + 1));

但它可以处理这个:

const c = pipe(1, call(x => x + 1), call(x => x + 1));

(不知道为什么)。 稍后当问题得到解决时(请继续进行操作: https//github.com/Microsoft/TypeScript/issues/22081 ),您将能够轻松找到所有call引用并将其删除。

暂无
暂无

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

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