typescript - ramda tür tanımını kullanırken, pipe fonksiyonu tip hatası veriyor


Ramda için tip tanım dosyasını (@types/ramda) yükledim, aşağıdaki kodu yazdığımda hiçbir sorun çıkmadı:

const gt5 = (x: number): boolean => x > 5
const inc = (x: number): number => x + 1
const f = pipe(map(inc), filter(gt5))
console.log(f([1,6,8]))

ama eğer filter ve map'in sırasını değiştirirsem:

const gt5 = (x: number): boolean => x > 5
const inc = (x: number): number => x + 1
const f = pipe(filter(gt5), map(inc))
console.log(f([1,6,8]))

Aşağıdaki hatayı aldım:

(takma ad) filter(fn: (value: number) => boolean): R.FilterOnceApplied (+4 aşırı yükleme) filter'i ithal et Bu çağrı ile eşleşen bir aşırı yükleme yok. Son aşırı yükleme aşağıdaki hatayı verdi. ‘FilterOnceApplied’ türündeki argüman, ‘(x0: unknown, x1: unknown, x2: unknown) => readonly number[]’ türündeki parametreye atanamaz. ‘source’ ve ‘x0’ parametrelerinin türleri uyumsuz. ‘unknown’ türü ‘number[] | Dictionary’ türüne atanamaz. ‘unknown’ türü ‘Dictionary’ türüne atanamaz. ts(2769) index.d.ts(2172, 9): Son aşırı yükleme burada tanımlanmış.

Elbette kod hâlâ doğru şekilde çalışıyor.

Bu hatayı nasıl düzeltebilirim?

VSCode kullanıyorum.

Cevap #1

filter, hem dizilerle hem de nesnelerle çalışması gerekir, ancak sonuç olarak typescript kafası karışıyor - buradan

Bu hatayı düzeltmenin bir yolu şudur:

const f = pipe(
  filter<number, "array">(gt5),
  map(inc)
);

Umarım yardımcı olur!

Cevap #2

Kendi tiplerinizi pipe fonksiyonuna ekleyebilirsiniz:

const gt5 = (x: number): boolean => x > 5;
const inc = (x: number): number => x + 1;
const f = pipe<[number[]], number[], number[]>(map(inc), filter(gt5));

İlk tür [number[]], pipe'a bir dizi olarak geçirilmesi amaçlanan argümanları temsil eder, sonraki türler number[], number[] ise pipe içindeki fonksiyonların map(inc), filter(gt5) dönüş değerlerini temsil eder.