2015-09-24 182 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()該函數。使用該字符串將只提取提供的名稱。

只要確保測試以確定它在被縮小後是否有效。