首页 > 解决方案 > 使用字符串从 Typescript 枚举中获取值

问题描述

我正在尝试从此枚举中获取值:

enum Sizes {
  Tiny = "Tiny",
  VerySmall = "Very Small",
  Small = "Small",
  Medium = "Medium",
  Large = "Large",
  VeryLarge = "Very Large"
}

使用其他 StackOverflows 中建议的以下代码,我得到以下输出:

var text=""
for (var size in Sizes) {
    text = text + "\n" + size;
}

console.log(text);

Tiny
VerySmall
Very Small
Small
Medium
Large
VeryLarge
Very Large

我不想要条目 VerySmall 和 VeryLarge,为什么会出现这些条目,如何获得我想要的结果?

谢谢!

标签: typescript

解决方案


使用的打字稿编译器似乎是 2.4 之前的版本,他们在枚举中添加了字符串值支持。通常存在从值到枚举的反向映射,并且值通常是数字。但是如果您尝试使用 2.4 之前的字符串,编译器将不知道如何处理它(并且实际上会产生错误)但仍会生成源代码。

比较 2.4:

var Sizes;
(function (Sizes) {
    Sizes["Tiny"] = "Tiny";
    Sizes["VerySmall"] = "Very Small";
    Sizes["Small"] = "Small";
    Sizes["Medium"] = "Medium";
    Sizes["Large"] = "Large";
    Sizes["VeryLarge"] = "Very Large";
})(Sizes || (Sizes = {}));

至 2.3:

var Sizes;
(function (Sizes) {
    Sizes[Sizes["Tiny"] = "Tiny"] = "Tiny";
    Sizes[Sizes["VerySmall"] = "Very Small"] = "VerySmall";
    Sizes[Sizes["Small"] = "Small"] = "Small";
    Sizes[Sizes["Medium"] = "Medium"] = "Medium";
    Sizes[Sizes["Large"] = "Large"] = "Large";
    Sizes[Sizes["VeryLarge"] = "Very Large"] = "VeryLarge";
})(Sizes || (Sizes = {}));

而 2.3 没有字符串值:

var Sizes;
(function (Sizes) {
    Sizes[Sizes["Tiny"] = 0] = "Tiny";
    Sizes[Sizes["VerySmall"] = 1] = "VerySmall";
    Sizes[Sizes["Small"] = 2] = "Small";
    Sizes[Sizes["Medium"] = 3] = "Medium";
    Sizes[Sizes["Large"] = 4] = "Large";
    Sizes[Sizes["VeryLarge"] = 5] = "VeryLarge";
})(Sizes || (Sizes = {}));

如果您想在 2.4 及更高版本中强制执行反向映射,您可以将值声明为any.

enum Sizes {
  Tiny = <any>"Tiny",
  VerySmall = <any>"Very Small",
  Small = <any>"Small",
  Medium = <any>"Medium",
  Large = <any>"Large",
  VeryLarge = <any>"Very Large"
}

只需称其为功能。


推荐阅读