我可以获得一个类型,该类型表示接口的键:
interface I { a: string; b: string; }
const i: keyof I; // typeof i is "a" | "b"是否有类似的方法来获得表示枚举值的类型?
enum E { A = "a", B = "b" }
const e: ?; // typeof e is "a" | "b"发布于 2021-08-11 19:43:28
发布于 2018-10-26 20:53:14
enum E { A = "a", B = "b" }
const e: keyof typeof E;操场实例
发布于 2021-03-18 19:25:55
事实上,枚举的名称本身就是值类型的联合的别名。以下代码演示了:
enum WaterType {
Lake = 0,
Ocean = 1,
River = 2,
Creek = 3,
};
let xxx: 0|1|2|3 = 2;
let yyy: WaterType = xxx; // OK
let zzz: 0|1|2|3 = yyy; // OKenum只是有点混乱,因为枚举的名称在某些上下文中引用类型(如0|1|2|3),但在其他上下文中,它以相同的名称引用对象。WaterType对象与此对象类似:
const WaterTypeObject = {
Lake : 0 as 0,
Ocean : 1 as 1,
River : 2 as 2,
Creek : 3 as 3,
};typeof WaterType和typeof WaterTypeObject实际上是一样的
let aaa: typeof WaterType = WaterType;
let bbb: typeof WaterTypeObject = aaa; // OK
let ccc: typeof WaterType = bbb; // OK在预期类型的上下文中,WaterType的意思是0|1|2|3,但您可以编写typeof WaterType以获得枚举对象的类型:
// VS code reports: type WaterTypeString = "Lake" | "River" | "Ocean" | "Creek"
type WaterTypeString = keyof typeof WaterType;
// VS code reports: type WaterTypeNumbers = WaterType
// which really means type WaterTypeNumbers = 0|1|2|3
type WaterTypeNumbers = (typeof WaterType)[WaterTypeString];请确保不要编写“Enum键”,例如,keyof WaterType与keyof number是相同的,这肯定不是您想要的。
有趣的事实:keyof typeof WaterType是个谎言。WaterType的密钥实际上是"Lake"|"River"|"Ocean"|"Creek"|0|1|2|3 (例如WaterType["Creek"]==3和WaterType[3]=="Creek")。
https://stackoverflow.com/questions/53016066
复制相似问题