我想在typescript中使用字符串枚举,但我看不到它支持反向Map。我有一个这样的enum:
enum Mode {
Silent = "Silent",
Normal = "Normal",
Deleted = "Deleted"
}
我需要这样使用它:
let modeStr: string;
let mode: Mode = Mode[modeStr];
是的,我不知道它在modeStr
字符串中是什么,我需要它解析为枚举,或者如果字符串没有在枚举定义中出现,则在运行时解析失败。我怎样才能做到最好?先谢了
7条答案
按热度按时间bvjveswy1#
我们可以将
Mode
设为一个类型和一个相同类型的值。更严格的版本:
String Enum作为此答案:
xxls0lw82#
到目前为止,我发现的最干净的方法是制作一个二级Map:
因此,您可以执行
let mode: Mode = reverseMode.get('Silent');
优点:不需要重复值,提供了枚举枚举的方法,保持TSLint愉快...
编辑:我最初写的是
Mode[mode]
,但是TS可能会在这一行抛出错误TS7015,所以我添加了强制转换。bfnvny8b3#
如果你可以使用代理,我做了一个更通用和紧凑的版本:
stringEnum.ts
用途:
uajslkp64#
这个答案来自@PhiLho
我没有足够的代表来评论他的信息。
但是,
.set
的第一个参数应该是键,第二个参数应该是值。reverseMode.set(modeValue, mode);
应该...
reverseMode.set(mode, modeValue);
导致了这个。。
@PhiLho可能错过了这一点的原因是因为OP提供的原始对象的键和值是相同的。
nx7onnlm5#
没有一个答案真的对我有用,所以我必须回到正常的循环。我的enum是
swvgeqrz6#
标准类型实现了这个功能--只需要检查undefined和handle即可。
此外,您可以在上面添加一个记录类型来扩展“枚举”,例如将简短的枚举键转换为更详细的输出(https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type):
mtb9vblg7#
对于所有仍在为此挣扎的人来说,这是一种快速而肮脏的方式。
但是,有一些警告,你应该知道!
微软将Git bug标记为“按预期工作”的最可能原因可能是因为这涉及字符串字面量,而枚举最初被设计为可索引的。虽然上面的代码可以使用TSLint运行,但它有两个问题。对象不能保证在转换为Array时保持预期的顺序,我们正在处理可能是唯一的或可能不是唯一的字符串。
看看这个StackBlitz,其中有两个值为“Silent”的Mode。你没有任何保证,它不会返回'忽略'超过'沉默'一旦查找完成。
https://stackblitz.com/edit/typescript-hyndj1?file=index.ts