我遇到了一个提供外部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
。通过这种方式省略了另外两个函数签名。
答案 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)