javascript - Typescript: enklare sätt att typa objekt till array-omvandling
Jag konverterar vissa egenskaper från ett objekt till en array.
const result = ({ a, b }: { a: string, b: number }) => [a, b]; // (string | number)[]
Men det vanliga sättet returnerar alltid en otillräcklig TypeScript-typ (string | number)[]
Jag måste alltid specificera min utmatningstyp för att det ska kunna ange resultatet korrekt.
const result = ({ a, b }: { a: string, b: number }): [string, number] => [a, b]; // [string, number]
Finns det ett enklare sätt?
Svar #1
Lägg bara till as const efter att arrayen har skapats - detta kallas en const-assertion. Det indikerar att den nyss skapade arrayen faktiskt är en tuple, vilket den måste vara om du ska räkna med att den har 2 element där det första är en sträng och det andra är ett nummer.
// readonly [string, number]
const result = ({ a, b }: { a: string, b: number }) => [a, b] as const;
Den enda skillnaden mellan detta och exemplet i din ursprungliga fråga är att den resulterande typen kommer att vara readonly. Det kommer inte finnas något sätt att ändra värdet på result om du inte gör en specifik assertion som skulle tillåta detta.
Svar #2
Såvitt jag vet finns det inte.
Du kan göra [a, b] as [string, number] men det är i princip samma omständlighet. Ett annat alternativ är att ge result en funktionstyp, men det flyttar bara "problemet" hit.
Dessutom är det inte så illa att lägga till den lilla returtypdeklarationen. Det finns inte mycket annat TS kan göra, eftersom det inte kan anta att du vill ha en [string, number] som standard. Det skulle vara långt från bakåtkompatibelt (eller ens önskvärt för de flesta).
