javascript - Hvordan bruke filter i TypeScript på forskjellige array-typer


Gitt er funksjonssignaturen nedenfor:

function foo(): string[] | number[]

Hvorfor klager TS på det følgende funksjonskallet til filter?

foo().filter((v) => true);
      ^^^^^^
      Error

Dette uttrykket kan ikke kalles. Hvert medlem av unjonstypen '{ (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): S[]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): number[]; } | { ...; }' har signaturer, men ingen av disse signaturene er kompatible med hverandre.

Selvfølgelig kan jeg kaste det til [], men hva er den riktige måten her? Feilmeldingen er veldig vanskelig å forstå. Hvordan ville man tyde dette?

Eksempel: Lekeplass

Svar #1

function foo(): (number|string)[]

Av samme grunn som her: Typescript: Hvordan mappe over union-array-type?

Svar #2

Sannsynligvis fordi det første argumentet i .filter()-metoden er typet i TS til å ha typen til elementene i arrayet. Siden funksjonen din i praksis «returnerer» .filter((v: number)): number[] | filter((v: string)): string[], er de to signaturene inkompatible.

Relaterte artikler