Vyhledávání na webu

typescript - při použití definice typu ramda funkce pipe vyvolá chybu typu


Nainstaloval jsem soubor s definicemi typů pro Ramda (@types/ramda), když napíšu následující kód, nejsou žádné stížnosti:

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]))

ale pokud změníme pořadí filtru a mapy:

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]))

Dostal jsem následující chybu:

(alias) filter(fn: (value: number) => boolean): R.FilterOnceApplied (+4 přetížení) import filter Žádné přetížení neodpovídá tomuto volání. Poslední přetížení vyvolalo následující chybu. Argument typu 'FilterOnceApplied' není přiřaditelný k parametru typu '(x0: unknown, x1: unknown, x2: unknown) => readonly number[]'. Typy parametrů 'source' a 'x0' nejsou kompatibilní. Typ 'unknown' nelze přiřadit k typu 'number[] | Dictionary'. Typ 'unknown' nelze přiřadit k typu 'Dictionary'.ts(2769) index.d.ts(2172, 9): Poslední přetížení je deklarováno zde.

Samozřejmě kód stále funguje správně.

Jak opravím tuto chybu?

Používám VSCode.

Odpověď č. 1

filter má fungovat jak s poli, tak s objekty, ale TypeScript se tím pádem zmatí - odtud

Tak jeden způsob, jak tuto chybu opravit, je:

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

Doufám, že to pomůže!

Odpověď č. 2

Své typy můžete přidat přímo k funkci pipe:

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

První typ [number[]] představuje argumenty určené k předání do pipe jako pole, následující typy number[], number[] představují návratové hodnoty funkcí v pipe map(inc), filter(gt5).