我一直在尝试找出
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]);
我认为这归结为打字稿正在按照代码的顺序进行推理,而不是构建类型依赖树并按该顺序对其进行评估。这是准确的吗?
有没有人深入了解这个问题?