tipler - TypeScript'te bir fonksiyonu elle nasıl curry yapabilirsiniz?


Dış ts türlerini sağlayan bir js kütüphanesiyle karşılaştım. Varsayalım ki o

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

declare const fn: ComplicatedFunction

Onu körileştirmek istiyorum:

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

Soru şu: p1'in tipi nasıl doldurulur? (tüm katı kontroller açık)

Türleri düzeltmek için generik kullanmayı denedim:

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

const curriedFn = curry2(fn)

ne yazık ki, curriedFn (b: boolean, p: any): number imzasına düşüyor. Diğer iki fonksiyon imzası bu şekilde atlanıyor.

Cevap #1

Fonksiyonun sonucu belirleyen bazı parametreleri olduğundan, curried fonksiyon için benzer bir tür kullanmanız gerekecek. Ne yazık ki, tür çıkarımı burada size yardımcı olmayacak, türü manuel olarak belirtmeniz ve orijinal fonksiyonu çağırırken bazı ek tür doğrulamaları kullanmanız gerekecek:

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)