在Typescript

时间:2015-09-24 15:00:56

标签: javascript typescript

我的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表达式来查找文件的名称。

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

据说......

  

有没有办法从Color的运行时javascript定义中获取字符串“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()。使用该字符串,它将仅提取所提供的名称。

请确保在缩小后测试是否有效。