ramda compose 函数的类型定义

问题描述 投票:0回答:0

我一直在尝试找出

compose
函数的正确类型定义,请参阅 github 上的讨论和 discord 上的讨论。

考虑 下面的例子,我将

compose
pipe
类型定义提炼成一个简洁的例子。这些定义对
pipe
有效,但对
compose
无效,尽管它们几乎相同(只有
f1
f2
的顺序不同)。

function compose2<R0, R1, R2>(
  f2: (a: R1) => R2,
  f1: (a: R0) => R1,
): (a: R0) => R2 {
  return (x: R0) => f2(f1(x));
}

const composeTest = compose2(
  R.defaultTo('fallback'),
  R.nth(1) // << typescript is already confused
)([1, 2]);

function pipe2<R0, R1, R2>(
  f1: (a: R0) => R1,
  f2: (a: R1) => R2,
): (a: R0) => R2 {
  return (x: R0) => f2(f1(x));
}

// correctly number | string
const pipeTest = pipe2(
  R.nth(1),
  R.defaultTo('fallback'),
)([1, 2]);

我认为这归结为打字稿正在按照代码的顺序进行推理,而不是构建类型依赖树并按该顺序对其进行评估。这是准确的吗?

有没有人深入了解这个问题?

typescript functional-programming ramda.js
© www.soinside.com 2019 - 2024. All rights reserved.