frontend - Typescript-fel ts(2769) i arrayens filterfunktion när det är i en if-sats som tidigare kontrollerar typ
Jag skulle vilja veta varför TypeScript klagar på att egenskapen moveInDate möjligen är string | undefined när den är inbäddad i ett if-block som kontrollerar om egenskapen är sanningsenlig eller inte. I koden nedan kan du se att när man använder console.log är typen string, men när man loopar igenom en array med .filter-funktionen läses den som string | undefined.
Jag vet att det finns flera sätt att komma runt detta, t.ex. new Date(filters.moveInDate!); eller new Date(filters.moveInDate as string);. Även genom att definiera en ny variabel const date=filters.moveInDate ovanför .filter-blocket och sedan använda den inuti .filter som return new Date(date). Men jag vill förstå varför detta fel uppstår från början?
Koden i fråga
export interface IStateFilters {
moveInDate?: string;
}
const arr = [1, 2, 3];
export const filter = (filters: IStateFilters) => {
if (filters.moveInDate) {
console.log(filters.moveInDate); // <- it is string over here
return arr.filter((apt) => {
return new Date(filters.moveInDate); // why is it string | undefined here?
});
}
return arr;
};
Länk till sandlåda
Svar #1
Det verkar som att TypeScript tappar typförminskningen när du använder filter:
export interface IStateFilters {
moveInDate?: string;
}
const arr = [1, 2, 3];
export const filter = (filters: IStateFilters) => {
if (typeof filters.moveInDate === 'undefined') return arr;
const moveIndate: string = filters.moveInDate;
return arr.filter((apt: number) => new Date(moveIndate)); // just string now
};
Möjligen kan detta hjälpa till att besvara det mer:
TypeScript: Varför kan inte min filtermetod begränsa typen och ta bort undefined och false från arrayen
https://github.com/microsoft/TypeScript/issues/16069
