在打字稿中映射枚举

时间:2017-03-13 00:24:20

标签: typescript

在打字稿中映射枚举的正确方法是什么?

例如,我正在玩一个在线打字稿代码编辑器,这很好用:

Rfc2898DeriveBytes

然而,在我的IDE class Message { name: string; min: number; max: number; messageType: MessageType; } enum MessageType { none, email, sms } var jsonObj = { "name": "some name", "min": 0, "max": 10, "messageType": MessageType.email } var messageInstance: Message = <Message>jsonObj; console.log(messageInstance); 中显示错误&#34;预期值&#34;如果我在json文件中使用它。

如果我尝试:

MessageType.email

在在线代码编辑器中会产生错误。

我刚刚开始,无法找到有关如何完成此操作的明确说明。

编辑:

我刚刚意识到枚举是基于数字的,因此"messageType": "MessageType.email" 或任何相应的数字都是正确的方法。

有没有办法让json文件中的枚举可读(比如像MessageType.email这样的值),因为单独查看时json文件没有枚举定义所以可能会让人感到困惑,所以我&# 39;如果可能的话,我宁愿这样做..

1 个答案:

答案 0 :(得分:4)

对于TypeScript 2.4 +:

您可以使用字符串枚举而不是数字枚举:

enum MessageType
{
    none = "none",
    email = "email",
    sms = "sms"
}

适用于旧版本的TypeScript:

您可以使用enum的索引器将string值转换为enum

const messageTypeAsString = MessageType[MessageType.email];

走另一条路也是有效的:

const messageType: MessageType = MessageType[messageTypeAsString];

据我所知,在序列化/反序列化JSON时无法自动执行此转换。

另一种选择是完全跳过enum并改为使用静态string

class MessageType {
    static readonly none = 'none';
    static readonly email = 'email';
    static readonly sms = 'sms';
}
type MessageTypeValue = 'none' | 'email' | 'sms'; 

const messageType: MessageTypeValue = MessageType.none;