打字稿基于字符串的枚举

时间:2016-09-02 08:32:24

标签: json string typescript enums code-completion

所以我已经阅读了Typescript中基于字符串的枚举的所有帖子,但我找不到符合我要求的解决方案。那些将是:

  • 提供代码完成的枚举
  • 可以迭代的枚举
  • 无需两次指定元素
  • 基于字符串

到目前为止,我在打字稿中看到的枚举的可能性是:

  1. enum MyEnum {bla, blub}:这是基于字符串的失败,所以我不能简单地读取基于字符串的JSON ...
  2. type MyEnum = 'bla' | 'blub':不可迭代且无代码完成
  3. 自己动手class MyEnum { static get bla():string{return "bla"} ; static get blub():string{return "blub"}}:指定两次元素
  4. 所以这里有问题:

    1. 没有办法同时满足这些要求?如果不是,将来是否可能?
    2. 为什么他们没有enums基于字符串?
    3. 有人遇到类似的问题,你是如何解决的?

2 个答案:

答案 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,因为属性的有效值仅为foobar

我想这就是为什么有些语言基于字符串Enums:)

的原因

TypeScript如何处理枚举

如果查看已编译的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,因为这些值在对象上存在“两次”。