请考虑以下typescript枚举:
enum MyEnum { A, B, C };
Run Code Online (Sandbox Code Playgroud)
如果我想要另一种类型是该枚举键的联合字符串,我可以执行以下操作:
type MyEnumKeysAsStrings = keyof typeof MyEnum; // "A" | "B" | "C"
Run Code Online (Sandbox Code Playgroud)
这非常有用.
现在我想以这种方式创建一个在枚举上普遍运行的泛型类型,这样我就可以说:
type MyEnumKeysAsStrings = AnyEnumKeysAsStrings<MyEnum>;
Run Code Online (Sandbox Code Playgroud)
我想是正确的语法是:
type AnyEnumKeysAsStrings<TEnum> = keyof typeof TEnum; // TS Error: 'TEnum' only refers to a type, but is being used as a value here.
Run Code Online (Sandbox Code Playgroud)
但是这会产生编译错误:"'TEnum'只引用一个类型,但在这里被用作值."
这是出乎意料和悲伤的.通过从泛型声明的右侧删除typeof,并将其添加到特定类型声明中的type参数,我可以通过以下方式完全解决它:
type AnyEnumAsUntypedKeys<TEnum> = keyof TEnum;
type MyEnumKeysAsStrings = AnyEnumAsUntypedKeys<typeof MyEnum>; // works, but not kind to consumer. Ick.
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种解决方法,因为这意味着消费者必须记住在通用上指定typeof.
是否有任何语法允许我指定我最初想要的泛型类型,以便对消费者友好?