TypeScript: Få medlemsnamn av const enum som en sträng?


Anta att jag har denna const enum-definition:

const enum Snack {
    Apple = 0,
    Banana = 1,
    Orange = 2,
    Other = 3
}

I min TypeScript-kod, kan jag få strängliteralet av en av medlemmarna?

I C# skulle det till exempel vara nameof(Snack.Orange). (Jag vet att nameof inte stöds av TypeScript och jag vet hur det är möjligt för icke-konstanta enums.)

Svar #1

Som standard tas konstanta enum helt bort vid kompilering, så det finns inget körobjekt som representerar enum. Du kan använda preserveConstEnums för att tvinga enum-objektet att genereras. Problemet är att kompilatorn fortfarande inte tillåter dig att komma åt enum-objektet, så du måste använda en lösning för att komma åt enum.

Med preserveConstEnums aktiverat kan vi placera enumen i ett namnrymd:

namespace enums {
    export const enum Snack {
        Apple = 0,
        Banana = 1,
        Orange = 2,
        Other = 3
    }
}
let enumName = (enums as any).Snack[enums.Snack.Apple];

Eller om enumen är inom en modul:

export const enum Snack {
    Apple = 0,
    Banana = 1,
    Orange = 2,
    Other = 3
}

let enumName = (exports as any).Snack[Snack.Apple];

Om du inte vill använda denna flagga kan du skapa ett objekt som enligt dess definition måste innehålla alla medlemmar av enum, och du kan söka i detta objekt efter namnet. Eftersom du kommer att få ett kompileringstidfel på detta objekt om du lägger till eller tar bort något från enum, kan detta vara en användbar lösning:

let SnackNames : { [P in keyof typeof Snack]: { Name: P, Value: typeof Snack[P] } } = {
    Apple : { Value: Snack.Apple, Name: "Apple" },
    Banana : { Value: Snack.Banana, Name: "Banana" },
    Orange : { Value: Snack.Orange, Name: "Orange" },
    Other : { Value: Snack.Other, Name: "Other" },
}

Relaterade artiklar