【发布时间】:2019-09-13 11:24:03
【问题描述】:
假设我有这个字符串枚举:
enum Color {
None = "Q",
Red = "R",
Green = "G",
Blue = "B",
}
现在,在 TypeScript 中,string enums have no reverse mappings,所以我不能写Color["Q"] 来获得潜在的Color。我尝试声明自己的辅助函数:
type StringEnum = {[key: string]: string};
function lookup<E extends StringEnum>(stringEnum: E, s: string): keyof E | undefined {
for (const enumValue of keysOf(stringEnum)) {
if (stringEnum[enumValue] === s) {
return enumValue;
}
}
return undefined;
}
keysOf 存在
function keysOf<K extends {}>(o: K): (keyof K)[];
function keysOf(o: any) { return Object.keys(o); }
...但实际上,我不知道返回类型应该是什么。这是为了编译,但不是:
const color: Color = lookup(Color, "Q") || Color.None;
因为lookup 函数的返回类型现在是"None" | "Red" | "Green" | "Blue" | undefined 而不仅仅是Color | undefined。
能在保留类型信息的同时很好的解决这个问题吗?
【问题讨论】:
标签: typescript enums