¿Tipo genérico para obtener claves de enumeración como cadena de unión en mecanografiado?
Considere la siguiente enumeración mecanografiada:
enum MyEnum { A, B, C };
Si quiero otro tipo que son las cadenas unidas de las claves de esa enumeración, puedo hacer lo siguiente:
type MyEnumKeysAsStrings = keyof typeof MyEnum; // "A" | "B" | "C"
Esto es muy útil.
Ahora quiero crear un tipo genérico que funcione universalmente en las enumeraciones de esta manera, para que pueda decir:
type MyEnumKeysAsStrings = AnyEnumKeysAsStrings<MyEnum>;
Me imagino que la sintaxis correcta para eso sería:
type AnyEnumKeysAsStrings<TEnum> = keyof typeof TEnum; // TS Error: 'TEnum' only refers to a type, but is being used as a value here.
Pero eso genera un error de compilación: "'TEnum' solo se refiere a un tipo, pero aquí se está utilizando como un valor".
Esto es inesperado y triste. Puedo solucionarlo de forma incompleta de la siguiente manera al soltar el typeof del lado derecho de la declaración del genérico y agregarlo al parámetro type en la declaración del tipo específico:
type AnyEnumAsUntypedKeys<TEnum> = keyof TEnum;
type MyEnumKeysAsStrings = AnyEnumAsUntypedKeys<typeof MyEnum>; // works, but not kind to consumer. Ick.
in embargo, no me gusta esta solución, porque significa que el consumidor debe recordar hacer esta especificación astuta de typeof en el genérico.
¿Existe alguna sintaxis que me permita especificar el tipo genérico que quiero inicialmente, ser amable con el consumidor?