【问题标题】:Getting the class name of an Enum in Typescript在 Typescript 中获取枚举的类名
【发布时间】:2015-12-22 06:06:54
【问题描述】:

我的 Typescript 应用程序中有一些枚举,我使用与此类似的代码来获取要在应用程序中显示的字符串值:

enum Color{ RED, BLUE, GREEN};

document.write( "The string for Red is: " + Color[Color.RED] );

但是,字符串值通常更符合数据库键或其他一些与服务器相关的字符串,而不是适合显示给用户的格式良好的字符串。 为了解决这个问题,我想加载本地化的属性文件,这些文件使用枚举的字符串值来查找格式良好的字符串以显示在应用程序中。该文件可能如下所示:

Color.properties:
RED=The color is red
BLUE=The color is blue
GREEN=The color is green

我相信我可以加载此文件并解析内容以填充一些查找,以便稍后在应用程序中显示,但我不确定如何知道要加载哪个属性文件。 对于以下枚举

Color
Shape
Animal

我将拥有以下属性文件:

Color.properties
Shape.properties
Animal.properties

我的问题是:有什么方法可以从颜色的运行时 javascript 定义中获取字符串“Color”? Color 的 Typescript 代码被转译成:

var Color;
(function (Color) {
    Color[Color["RED"] = 0] = "RED";
    Color[Color["BLUE"] = 1] = "BLUE";
    Color[Color["GREEN"] = 2] = "GREEN";
})(Color || (Color = {}));

我认为我无法以任何简单的方式从中获取字符串颜色。我假设我只需要使用 switch 表达式来查找文件的名称。

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    将字符串存储在 TypeScript 文件中,然后使用实际的枚举(Color)进行映射可能更容易。

    话虽如此......

    有什么方法可以从运行时 javascript 定义的 Color 中获取字符串“Color”?

    一个可靠的解决方案是使用ts-nameof 之类的东西。

    或者,您可以使用this answer 中概述的类似技巧:

    function getVariableName(variableFunction: () => any) {
        return /\s([^\s;]+);?\s*\}$/.exec(variableFunction.toString())[1];
    }
    
    var variableName = getVariableName(() => Color); // returns string "Color"
    

    这将 Color 包装在一个函数中,然后在该函数上调用 .toString()。使用该字符串,它将仅提取提供的名称。

    只要确保你在缩小后测试看看这是否有效。

    【讨论】:

      【解决方案2】:

      不,语言中没有内置任何东西可以让您在运行时获取枚举的名称。

      但是,我使用了以下方法:

      namespace MyEnums {
      
          export enum Color { RED, BLUE, GREEN };
      
          export enum Shape { ROUND, SQUARE };
      
          export function getName(enumObj: any): string {
      
              for (let name in MyEnums) {
                  if ( MyEnums[name] === enumObj && MyEnums.hasOwnProperty(name) ) {
                      return name;
                  }
              }
      
              return undefined;
          }
      }
      
      const Color = MyEnums.Color;
      
      var name = MyEnums.getName(Color);
      

      虽然,我最终重构了我的代码,所以我不需要在最后得到名称。

      【讨论】:

        猜你喜欢
        • 2018-06-24
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        相关资源
        最近更新 更多