1. ホーム
  2. enums

[解決済み] プログラムでenum型を列挙するには?

2023-01-21 07:34:21

質問

例えば、TypeScriptの enum , MyEnum は、以下のようになります。

enum MyEnum {
    First,
    Second,
    Third
}

の配列を生成するために、TypeScript 0.9.5で最も良い方法は何でしょうか? enum の値の配列を生成するには、TypeScript 0.9.5でどのような方法があるでしょうか?例を挙げます。

var choices: MyEnum[]; // or Array<MyEnum>
choices = MyEnum.GetValues(); // plans for this?
choices = EnumEx.GetValues(MyEnum); // or, how to roll my own?

どのように解決するのですか?

これは、そのenumのJavaScript出力です。

var MyEnum;
(function (MyEnum) {
    MyEnum[MyEnum["First"] = 0] = "First";
    MyEnum[MyEnum["Second"] = 1] = "Second";
    MyEnum[MyEnum["Third"] = 2] = "Third";
})(MyEnum || (MyEnum = {}));

というのは、このようなオブジェクトです。

{
    "0": "First",
    "1": "Second",
    "2": "Third",
    "First": 0,
    "Second": 1,
    "Third": 2
}

文字列の値を持つ列挙型メンバー

TypeScript 2.4ではenumが文字列のenumメンバ値を持つことができるようになりました。そのため、以下のようなenumを作成することが可能です。

enum MyEnum {
    First = "First",
    Second = 2,
    Other = "Second"
}

// compiles to
var MyEnum;
(function (MyEnum) {
    MyEnum["First"] = "First";
    MyEnum[MyEnum["Second"] = 2] = "Second";
    MyEnum["Other"] = "Second";
})(MyEnum || (MyEnum = {}));

メンバー名の取得

すぐ上の例を見て、enumのメンバを取得する方法を考えてみることができます。

{
    "2": "Second",
    "First": "First",
    "Second": 2,
    "Other": "Second"
}

思いついたのはこんな感じです。

const e = MyEnum as any;
const names = Object.keys(e).filter(k => 
    typeof e[k] === "number"
    || e[k] === k
    || e[e[k]]?.toString() !== k
);

メンバー値

名前が決まれば、それをループして対応する値を得ることができます。

const values = names.map(k => MyEnum[k]);

拡張機能クラス

自分で関数を作るのが一番いいと思います(例. EnumEx.getNames(MyEnum) ). enumに関数を追加することはできません。

class EnumEx {
    private constructor() {
    }

    static getNamesAndValues(e: any) {
        return EnumEx.getNames(e).map(n => ({ name: n, value: e[n] as string | number }));
    }

    static getNames(e: any) {
        return Object.keys(e).filter(k => 
            typeof e[k] === "number"
            || e[k] === k
            || e[e[k]]?.toString() !== k
        );
    }

    static getValues(e: any) {
        return EnumEx.getNames(e).map(n => e[n] as string | number);
    }
}