如何键入 lodash/fp 柯里化函数?

How do I type lodash/fp curried functions?

我正在尝试添加流式输入。我从 lodash/fp 模块开始,因为它对我自己最有用。但是,我正在为如何正确输入而苦恼。

一个简单的例子如果dropRightWhile:

declare function dropRightWhile<T>(iteratee: (val: T)=>boolean, data?: Array<T>): Array<T> | (data: Array<T>)=>Array<T>;

这是我尝试输入的。 dropRightWhile 必须接受一个迭代器,它可以接受数据。如果你不给它数据,那么它 return 是一个获取数据的函数,但如果你给它数据,那么它 return 是一个数组。

我做的类型并没有严格地将参数数量和return类型联系起来。但是,当我尝试使用咖喱 dropRightWhile 时出现错误

var c = dropRightWhile((x) => x> 0); c([0, 1, 2, 3]); error: Function cannot be called on array type

我原以为既然 dropRightWhile 可以 return 一个函数,那么我就可以调用它,但似乎数组类型妨碍了。

有什么建议吗?

您可以定义 2 个重载

declare function dropRightWhile<T>(iteratee: (val : T) => boolean, data : Array<T>) : Array<T>;
declare function dropRightWhile<T>(iteratee: (val : T) => boolean): (data : Array<T>) => Array<T>;

// tests
const iteratee = x => x > 0;
(dropRightWhile(iteratee)([0, 1, 2, 3]) : Array<number>);
(dropRightWhile(iteratee, [0, 1, 2, 3]) : Array<number>)