Enum.GetValues(typeof(TEnum)) i Typescript


I Typescript skulle jag vilja få alla värden av en enum-typ i en array. Motsvarigheten i C# har varit denna:

public static TEnum[] GetValues<TEnum>() where TEnum : Enum
{
    return Enum.GetValues(typeof(TEnum))
        .OfType<TEnum>()
        .ToArray();
}

Vad är den bästa översättningen av denna metod till Typescript så att en möjlig användning skulle vara:

const allCountries: Country[] = GetEnumValues<Country>();

Uppdatering: Jag använder Typescript 3.9.4 och det är inget problem att använda en nyare version.

Svar #1

Det kan enkelt göras. Du kan bara inte använda det med const enum. Typescript kommer att klaga om du använder det, eftersom det inte är tillgängligt vid körning.

type EnumLike = Record<string, string | number>

function getEnumValues<T extends EnumLike>(en: T): Array<T[keyof T]> {
   return Object.keys(en)
     // This filters the reverse mappings: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings
     // Without the filter, numeric values are added to the array twice. Once as a string and again as a number
     .filter(k => !isFinite(Number(k))) 
     .map(k => en[k]) as Array<T[keyof T]>;
}

exempel på användning:

enum ExampleEnum {
  a = 1,
  b = 'two'
}

console.log(getEnumValues(ExampleEnum)) // [1, 'two']

Se även som exempel: https://stackblitz.com/edit/typescript-z2swch