typescript - Definiera en unionstyp från en array av strängar
Säg att jag har en array:
const fruits = ["Apple", "Orange", "Pear"];
och jag vill definiera ett objekt som kartlägger varje frukt till några roliga fakta om den:
interface Facts {
color: string,
typicalWeight: number
}
const fruitFacts: { [key: members of fruits]: Facts } = {
"Apple": { color: "green", typicalWeight: 150 }
//
}
Hur gör jag den delen [key: members of fruits]?
Svar #1
TypeScript 3.4 lade till const-påståenden som möjliggör att skriva detta som:
const fruits = ["Apple", "Orange", "Pear"] as const;
type Fruit = typeof fruits[number]; // "Apple" | "Orange" | "Pear"
Med as const härleder TypeScript typen av fruits ovan som readonly["Apple", "Orange", "Pear"]. Tidigare skulle det härleda den som string[], vilket förhindrar att typeof fruits[number] producerar den önskade unionstypen.
Svar #2
Det kan göras men först behöver du en extra funktion för att hjälpa till att härleda strängliteraltypen för arrayelementen. Som standard kommer Typescript att härleda string[] för en array även om det är en konstant. Efter att vi har en array av strängliteraltyper kan vi helt enkelt använda en typfråga för att få önskad typ.
function stringLiteralArray<T extends string>(a: T[]) {
return a;
}
const fruits = stringLiteralArray(["Apple", "Orange", "Pear"]);
type Fruits = typeof fruits[number]
Sedan 3.4 kan du också använda en konstant typförsäkran istället för stringLiteralArray-funktionen:
const fruits = ["Apple", "Orange", "Pear"] as const;
type Fruits = typeof fruits[number]
