javascript - sortera värdet av en nyckel från ett objekt i en array där nyckeln är av valfri typ i typescript?


Vad är bästa praxis för mig att sortera ett objekt av array efter värdet på en nyckel där nyckeln är av valfri typ från Object? Jag har följande kod som fungerar om num inte är av valfri typ. Men jag fick ett fel att Object är möjligen 'undefined'.

type Filter = {
    a: number;
    num?: number

}
const filter: Filter[] = [{a: 1, num: 10}, {a: 1, num: 12}, {a: 1, num: 5}]
filter.sort((a,b)=> (a.num > b.num ? 1 : -1))
console.log(filter)

Svar #1

Två alternativ kommer i åtanke:

  1. Det uppenbara: använd en typ där num inte är valfri. Du kan använda hjälp-typen Required om du inte vill behålla båda typerna utan att skriva om egenskaperna.

  2. Om du inte kan ändra typen betyder det förmodligen att du verkligen vill att den egenskapen ska vara valfri. Så du bör helt enkelt kontrollera den i din sorteringsfunktion. Du behöver kontrollera om num är undefined och bestämma vad som ska returneras när det inträffar. När du kontrollerar det kommer Typescript att härleda att allt som faller utanför det villkoret kommer att vara definierat. Till exempel:

filter.sort((a,b)=> {
  if (typeof a.num === 'undefined' || typeof b.num === 'undefined') {
    return 0;
  }
  return (a.num > b.num ? 1 : -1)
})

Svar #2

För att lägga till AqueleHugo:s svar, ville jag hålla fältet valfritt (för att korrekt återspegla tredjepartsgränssnittet), men fortfarande hålla det rent, enkelt och läsbart, så jag har gått med detta och det fungerar bra för min situation:

interface WebPage {
  // ...
  order?: number;
}

const sortPages = (pages: WebPage[]): WebPage[] => {
    return pages.filter(p => p.order).sort((p1, p2) => Number(p1.order) - Number(p2.order));
}

Förhoppningsvis tycker någon annan att detta är användbart!