TypeScript の Enum で「値を指定してメンバー名を取得する方法」 と 「そうできる理由」

Enum(列挙型) の使い方がよく解っていなくて調べた話

  • 公式ドキュメント
enum GENDER {
  MALE = 1,
  FEMALE = 2,
}

enum GENDER_NAME {
  MALE = '男性',
  FEMALE = '女性',
}

こんな enum  があった場合

 

  • Enumのメンバーを指定して値を取得
console.log(GENDER.MALE); //1
  • 逆に、値を指定してメンバー名を取得 //これを勝手に出来ないものだと思っていた
console.log(GENDER[1]); //'MALE'
  • (こんなふう利用したかった)
// 1 を '男性' に変換
console.log(GENDER_NAME[GENDER[1]]); //'男性'

値を指定してメンバー名を取得できる理由

export var GENDER;
(function (GENDER) {
GENDER[GENDER["MALE"] = 1] = "MALE";
GENDER[GENDER["FEMALE"] = 2] = "FEMALE";
})(GENDER || (GENDER = {}));
  • なので 列挙型 GENDER として生成されるのは下記のようなオブジェクトになるようです
Object {1: "MALE", 2: "FEMALE", FEMALE: 1, FEMALE: 2}
  • console.log(GENDER[1]) //"MALE" に納得!

P.S 上記を踏まえると、Enum をループしたときに下記のようにメンバー名(ここでいう MALE とか)も出力されちゃうのが納得できた

for(let value in GENDER) {
  console.log(value); //"MALE", "FEMALE", 1, 2 
}
  • 値だけ出力したい場合は下記のようにした
for(let value in GENDER) {
  if(!isNaN(value)) {
    console.log(value); //1, 2 
  }
}
  • Enum の上手い使い方がいまいち解っていません。もっと良い方法があれば知りたいです。