2016-10-04 70 views
2

我试图添加到流式打字。我从lodash/fp模块开始,因为这对我自己来说是最有用的。但是,我正在努力如何正确输入。如何输入lodash/fp咖喱菜单功能?

一个简单的例子,如果dropRightWhile

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

这是我尝试输入。 dropRightWhile必须进行迭代,并且可能需要数据。如果你不给它的数据,那么它会返回一个接收数据的函数,但如果你给它的数据,那么它将返回一个数组。

我所做的类型并不严格地使参数数量和返回类型之间的连接。然而,当我尝试使用咖喱dropRightWhile我得到一个错误

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

我会一直想,既然dropRightWhile可以返回一个函数,那么我就能够调用它,但它似乎数组类型正在阻碍。

有什么建议吗?

回答

6

您可以定义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>)