所以我已经阅读了Typescript中基于字符串的枚举的所有帖子,但我找不到符合我要求的解决方案。那些将是:
到目前为止,我在打字稿中看到的枚举的可能性是:
enum MyEnum {bla, blub}
:这是基于字符串的失败,所以我不能简单地读取基于字符串的JSON ... type MyEnum = 'bla' | 'blub'
:不可迭代且无代码完成class MyEnum { static get bla():string{return "bla"} ; static get blub():string{return "blub"}}
:指定两次元素所以这里有问题:
enums
基于字符串?答案 0 :(得分:2)
为什么他们没有使用基于字符串的字符串
要清楚,枚举是数字和字符串,因为直接访问是[AllowAnonymous]
,反向地图是number
({{3 }})。
排除原始枚举的关键原因是
所以我不能简单地读取基于字符串的JSON ......
你会遇到同样的事情,例如在阅读string
时,因为JSON没有日期数据类型。您可以Date
转换这些内容。
您将使用相同的策略从服务器端new Date("someServerDateTime")
(字符串)转到TS enum
(数字)。由于反向查找enum
将服务器端数据转换为客户端活动数据的过程有时称为“水合”。我目前最喜欢的lib是more on this
我亲自在服务器访问级别处理这些内容,即手写一个使XHR +进行序列化的API。
在我上一份工作中,我们通过代码生成实现了自动化,甚至更多(支持服务器和客户端代码之间的常见验证模式)。
答案 1 :(得分:2)
我认为用类似C的样式实现Enum
很好,因为Enum
(类似于Symbol
)通常用于声明唯一的值可识别的开发时间。机器如何在运行时表示该值并不真正与开发人员有关。
但是我们开发人员有时想要的东西(因为我们都很懒,但仍希望获得所有好处!),是使用Enum
作为API或使用API即使API基本上是Enum
,也不会与我们共享Enum
,因为属性的有效值仅为foo
和bar
。
我想这就是为什么有些语言基于字符串Enums
:)
如果查看已编译的JavaScript,您可以看到TypeScript只使用普通的JavaScript对象来实现Enum
。例如:
enum Color {
Red,
Green,
Blue
}
将被翻译成:
{
0: "Red",
1: "Green",
2: "Blue",
Blue: 2,
Green: 1,
Red: 0
}
这意味着您可以像Color[Color.Red]
一样访问字符串值。您仍然可以完成代码,而不必两次指定值。 但是你不能只Object.keys(Color)
来迭代Enum
,因为这些值在对象上存在“两次”。