最佳答案
考虑下面的输入脚本枚举:
enum MyEnum { A, B, C };
如果我想要另一个类型是该枚举的键的联合字符串,我可以执行以下操作:
type MyEnumKeysAsStrings = keyof typeof MyEnum; // "A" | "B" | "C"
这是非常有用的。
现在我想创建一个泛型类型,它以这种方式对枚举进行普遍操作,这样我就可以说:
type MyEnumKeysAsStrings = AnyEnumKeysAsStrings<MyEnum>;
我想正确的语法应该是:
type AnyEnumKeysAsStrings<TEnum> = keyof typeof TEnum; // TS Error: 'TEnum' only refers to a type, but is being used as a value here.
但是这会产生一个编译错误: “‘ TEnum’只引用了一个类型,但是在这里被用作一个值。”
这真是出乎意料又令人难过。我可以通过以下方法不完全地解决这个问题: 从泛型声明的右侧删除 typeof,并将其添加到特定类型声明的 type 参数中:
type AnyEnumAsUntypedKeys<TEnum> = keyof TEnum;
type MyEnumKeysAsStrings = AnyEnumAsUntypedKeys<typeof MyEnum>; // works, but not kind to consumer. Ick.
但是我不喜欢这种变通方法,因为它意味着使用者必须记住在泛型上指定 typeof。
是否有任何语法允许我指定我最初想要的泛型类型,以满足消费者的需求?