Tipo genérico para obter chaves enum como string de união no texto datilografado?
Considere a seguinte enumeração datilografada:
enum MyEnum { A, B, C };
Se eu quiser outro tipo que seja as seqüências de caracteres unidas das chaves dessa enumeração, eu posso fazer o seguinte:
type MyEnumKeysAsStrings = keyof typeof MyEnum; // "A" | "B" | "C"
Isto é muito útil.
Agora, quero criar um tipo genérico que opere universalmente em enums dessa maneira, para que eu possa dizer:
type MyEnumKeysAsStrings = AnyEnumKeysAsStrings<MyEnum>;
Eu imagino que a sintaxe correta para isso seria:
type AnyEnumKeysAsStrings<TEnum> = keyof typeof TEnum; // TS Error: 'TEnum' only refers to a type, but is being used as a value here.
Mas isso gera um erro de compilação: "'TEnum' refere-se apenas a um tipo, mas está sendo usado como um valor aqui."
Isso é inesperado e triste. Posso contornar isso da seguinte maneira, removendo o typeof do lado direito da declaração do genérico e adicionando-o ao parâmetro type na declaração do tipo específico:
type AnyEnumAsUntypedKeys<TEnum> = keyof TEnum;
type MyEnumKeysAsStrings = AnyEnumAsUntypedKeys<typeof MyEnum>; // works, but not kind to consumer. Ick.
Não gosto dessa solução alternativa, porque isso significa que o consumidor deve se lembrar de fazer essa especificação nojenta do tipo de genérico.
Existe alguma sintaxe que me permita especificar o tipo genérico como eu quero inicialmente, para ser gentil com o consumidor?