如何在TypeScript中手动curry函数?

时间:2018-01-08 08:15:21

标签: typescript types functional-programming currying

我遇到了一个提供外部ts类型的js lib。假设它是

interface ComplicatedFunction {
    (n: number, p: any): string,
    (s: string, p: any): number,
    (b: boolean, p: any): number,
}

declare const fn: ComplicatedFunction

我想讨好它:

import fn from 'fn'
const curriedFn = (p1: ?) =>
    (p2: any) =>
        fn(p1, p2)

问题是如何填充p1的类型? (所有严格的检查)

我尝试使用泛型来修复类型:

const curry2 = <P1, P2, R>(fn: (n: P1, m: P2) => R) =>
    (n: P1) => (m: P2) => fn(n, m)

const curriedFn = curry2(fn)

不幸的是,curriedFn属于签名(b: boolean, p: any): number。通过这种方式省略了另外两个函数签名。

1 个答案:

答案 0 :(得分:1)

由于函数有一些决定结果类型的参数,因此您需要为curried函数使用类似的类型。不幸的是,类型推断在这里没有帮助,你需要手动指定类型,并在调用原始函数时使用一些额外的类型断言:

const curriedFn : {
    (n: number): (p: any) => string,
    (s: string): (p: any) => number,
    (b: boolean): (p: any) => number,
} = (p1: number | string | boolean) => (p2: any) => <any>fn(<any>p1, p2)