Lodash使用咖喱与绑定导致打字稿错误

时间:2018-02-05 16:27:11

标签: javascript typescript lodash

我正在尝试将bind方法与curry一起使用,但它会给我一个类型错误。

const curried = curry(this.method.bind(this));
const getSomething = curried(a, b);

从getSomething获取TS错误:

  

预计0-1参数但得到2。

当我没有使用绑定方法时,它没有抱怨。

const curried = curry(this.method);
const getSomething = curried(a, b);

1 个答案:

答案 0 :(得分:1)

问题是这是bind的签名:

bind(this: Function, thisArg: any, ...argArray: any[]): any;

因此函数bind的返回值为anycurry仍然有效,因为any可以转换为任何其他类型,因此声明顺序中的第一个重载使用curry,即这一个:

curry<T1, R>(func: (t1: T1) => R, arity?: number): CurriedFunction1<T1, R>;

T1R推断为{}

这是远离bind的原因,它会丢失类型信息。编写bind的通用类型安全版本很困难,因为它可以绑定this和函数参数,但是只绑定this并保留类型信息的版本易于编写:

function typedThisBind<T1, T2, T3, T4, R>(fn: (t: T1, t2: T2, t3: T3, t4 : T4) => R, thisArg: any) : typeof fn
function typedThisBind<T1, T2, T3, R>(fn: (t: T1, t2: T2, t3: T3) => R, thisArg: any) : typeof fn
function typedThisBind<T1, T2, R>(fn: (t: T1, t2: T2) => R, thisArg: any) : typeof fn
function typedThisBind<T1, R>(fn: (t: T1) => R, thisArg: any) : typeof fn
function typedThisBind<R>(fn: () => R, thisArg: any) : () => R
function typedThisBind(fn: Function, thisArg: any) : any {
    return fn.bind(thisArg);
}

现在使用这个版本的bind应该按预期工作(对于最多包含5个参数的函数,但你可以轻松添加更多):

class Foo {
    method(a: number, b: number) {}
    m(){
        const curried = curry(typedThisBind(this.method, this));
        const getSomething = curried(0, 0); // Works as expected.
    }
}