typer - Hvordan manuelt curry en funksjon i TypeScript?


Jeg kom over et js-bibliotek som ga de eksterne ts-typene. Forutsatt at det er

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

declare const fn: ComplicatedFunction

Jeg vil karri det:

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

Spørsmålet er hvordan man fyller ut typen til p1? (alle strenge kontroller på)

Jeg prøvde å bruke generisk for å fikse typene:

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

const curriedFn = curry2(fn)

dessverre faller curriedFn inn i signaturen (b: boolean, p: any): number. De to andre funksjonssignaturene blir utelatt på denne måten.

Svar #1

Siden funksjonen har noen parametere som bestemmer resultattypen, vil du trenge å bruke en lignende type for den curryede funksjonen. Dessverre vil ikke typeinferens hjelpe deg her, du må spesifisere typen manuelt, og bruke noen ekstra typeassertasjoner når du kaller den originale funksjonen:

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)