【发布时间】:2020-02-13 00:12:56
【问题描述】:
我有一个处理承诺的map 的咖喱版本。它需要两个参数,一次一个。它需要两个类型参数来让调用者提供无法推断的片段。然而,实际上调用者总是必须提供它们,因为类型不是在它们传入的转换函数中推断出来的。函数看起来像这样:
/**
* @description
* Like `ramda.map`, but handles an iterator that returns a promise (or not).
*
* @example
* await mapP((x: number) => Promise.resolve(x + 1))([1, 2, 3]) // -> [2, 3, 4]
*/
export const mapP = <T, R>(xf: (value: T) => Promise<R> | R) => (
data: T[],
): Promise<R[]> => pipe(when(isNil, always([])), map(xf), allP)(data)
这是我调用它,你可以看到 x 不为类型系统所知。
如何解决我编写函数以使类型工作的方式(不放弃柯里化 - 我知道如果不柯里化它会解决的)?
【问题讨论】:
-
这可能不是这种情况,但你能确保它不会编译。我想确保不只是 IDE 的类型推断不好
-
是的,确认
tsc显示相同的错误。 -
请将代码发布为文本,而不仅仅是图像(有关更多信息,请参阅How to Ask)。我希望能够将其复制并粘贴到独立的 IDE 中以提出答案,但现在我不能。 minimal reproducible example 对获得好的答案大有帮助。祝你好运!
-
另外,鉴于有人应该能够编写
const f = mapP(x => x.name),然后是f(data),你会如何建议编译器知道x是Foo类型?mapP((x: Foo)=>x.name)(data)是否满足您的需求?这里的主要问题似乎是上下文类型推断没有从data向后延伸到上一个函数调用中的x类型。 -
@jcalz 是的,我的想法完全正确。我不知道在前一种情况下它是如何知道的,但希望有一些我不知道的魔法。
标签: typescript functional-programming currying