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.
