golangの日記

Go言語を中心にプログラミングについてのブログ

TypeScript enum の使い方

typescript.png


TypeScript enum の使いかた





目次



enum の定義


連番の値を持った連想配列を生成する

enum Enum {
    A, // 0
    B, // 1
    C  // 2
}

// 値とキーを反転させたやつも持ってる
console.log(Enum); // { '0': 'A', '1': 'B', '2': 'C', A: 0, B: 1, C: 2 }
console.log(Enum[0], Enum[1], Enum[2]); // A, B, C


JavaScriptにトランスパイルすると以下のようになる

var Enum;
(function (Enum) {
    Enum[Enum["A"] = 0] = "A";
    Enum[Enum["B"] = 1] = "B";
    Enum[Enum["C"] = 2] = "C";
})(Enum || (Enum = {}));



最初の値を指定するとその数値からの連番になる

enum Enum {
    A = 10, // 10
    B,      // 11
    C       // 12
}

console.log(Enum); // { '10': 'A', '11': 'B', '12': 'C', A: 10, B: 11, C: 12 }


使用例

enum Weekday {
    Sun,
    Mon,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat
}

let date = new Date();
let Y    = date.getFullYear();
let m    = date.getMonth() + 1;
let d    = date.getDate();
// getDay は 0 ~ 6 までの数値を返すので enum を使って曜日を文字にする
let b    = Weekday[date.getDay()];
let H    = date.getHours();
let M    = date.getMinutes()
console.log(`${Y}/${m}/${d} (${b}) ${H}:${M}`); // 2021/3/16 (Tue) 21:00



enum をフラグとして使う


ビット演算子: https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Expressions_and_Operators#bitwise_operators


enum Flag {
    A = 1,      // 1
    B = 1 << 1, // 2
    C = 1 << 2, // 4
    D = 1 << 3  // 8
}

console.log(Flag);
// { '1': 'A', '2': 'B', '4': 'C', '8': 'D', A: 1, B: 2, C: 4, D: 8 }

let flags: Flag = 0;

// A と C のフラグを ON にする
flags = Flag.A | Flag.C;

// 以下 A と C は 1 で、それ以外は 0 なので出力されない
if (flags & Flag.A) {
    console.log("A flag is ON"); // ON
}
if (flags & Flag.B) {
    console.log("B flag is ON");
}
if (flags & Flag.C) {
    console.log("C flag is ON"); // ON
}
if (flags & Flag.D) {
    console.log("D flag is ON");
}

// フラグの削除
flags ^= Flag.A;

if (flags & Flag.A) {
    console.log("A flag is ON");
}
if (flags & ~Flag.A) {
    console.log("A flag is OFF"); // OFF
}

// DフラグをONにする
flags |= Flag.D;

if (flags & Flag.D) {
    console.log("D flag is ON"); // ON
}

// ONになってるフラグをOFFにする
flags ^= Flag.C;
flags ^= Flag.D;
console.log(flags); // 0

// すべてのフラグをONにする
flags = Flag.A | Flag.B | Flag.C | Flag.D;
// すべてのフラグをONにした状態で flags を2進数にする
console.log(flags.toString(2)); // 1111