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.
