Typescript Map alla enumvärden som nyckel


Jag deklarerar en karta så att jag kan omvandla det numeriska enum-värdet till det värde som vår API förväntar sig.

export const StatusMap: ReadonlyMap<Status, string> = new Map([
    [Status.NEW, 'new'],
    [Status.PENDING, 'pending'],
]);

Men när jag gör statusMap.get(Status.NEW) säger det alltid att returvärdet möjligen är odefinierat. Finns det ett sätt att tvinga en karta (eller liknande) att innehålla alla enumvärden?

Och ja, jag vet att du tekniskt sett kan göra

export enum Status {
    NEW = 'new',
    PENDING = 'pending',
}

men låt oss vara ärliga, det här förstör på sätt och vis poängen med enums (enligt mig).

Svar #1

Om du kan använda ett vanligt objekt istället för Map, kan det definieras som en Record av enum-medlemmar:

const statusMap: Record<Status, string> = {
    [Status.NEW]: 'new',
    [Status.PENDING]: 'pending',
};

Lekplats

Ett annat alternativ skulle vara att använda typassertering som garanterar att alla enum-medlemmar finns i mappen:

type StatusMap = { get<T extends Status>(status: T): string }

const statusMap = new Map([
    [Status.NEW, 'new'],
    [Status.PENDING, 'pending'],
]) as StatusMap;

** Var uppmärksam, med detta tillvägagångssätt är det inte garanterat att alla enum-medlemmar finns i mappen vid körning, så om du väljer att gå denna väg - är det bättre att täcka det med ett enhetstest.

Relaterade artiklar