在Typescript中获取Enum的类名

Getting the class name of an Enum in Typescript

本文关键字:Enum 获取 Typescript      更新时间:2023-09-26

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

enum Color{ RED, BLUE, GREEN};
document.write( "The string for Red is: " + Color[Color.RED] );

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

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的Typescript代码被翻译成:

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

我不认为我可以用任何简单的方法把String Color弄出来。我假设我只需要使用switch表达式来查找文件名。

不,语言中没有任何内置功能允许您在运行时获取enum的名称。

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

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);

虽然,我最终重构了我的代码,这样我就不需要在最后得到名字了

把你存储字符串的文件放在TypeScript文件中,然后使用实际的enum——Color来进行映射,可能会更容易。

话虽如此…

是否有任何方法从运行时javascript的颜色定义中获得字符串"颜色"?

一个可靠的解决方案是使用ts-nameof.

或者,您可以使用类似的技巧,如下所示:

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

将Color封装在函数中,然后在该函数上调用.toString()。使用该字符串,它将只提取所提供的名称。

只要确保在最小化后测试一下是否有效。