2015-09-24 146 views
1

获取一个枚举的类名我在我的打字稿应用一些枚举和我用类似这样的代码来获取字符串值在应用程序中显示:在打字稿

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颜色的定义获取字符串“颜色”的任何方式? 彩色打字稿代码被transpiled到:

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

我不认为我能得到串色出来,在任何简单的方法。我假设我只是需要使用switch表达式来查找文件的名称。

回答

1

不,在语言中没有内容可以让你在运行时得到一个枚举的名字。

但是,我用下面的方法去做:

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

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

1

将文件存储在TypeScript文件中然后使用实际enum- Color来执行映射可能更容易。

虽这么说......

有从运行时的JavaScript颜色的定义获取字符串“颜色”的方法吗?

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

或者,您可以使用在this answer提出了一个类似的技巧:

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

var variableName = getVariableName(() => Color); // returns string "Color" 

这种包装色彩在函数然后调用.toString()该函数。使用该字符串将只提取提供的名称。

只要确保测试以确定它在被缩小后是否有效。