[解決済み] プログラムで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);
}
}
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Godotで文字列をenumに変換するには?
-
[解決済み] Typescript の enum スイッチが機能しない
-
[解決済み] JavaScriptはオブジェクトのプロパティの順序を保証するか?
-
[解決済み] enumの項目名を取得する方法は?
-
[解決済み] Dart enumの "値 "を取得する方法
-
[解決済み] TypeScriptでenumのような型を作成する方法は?
-
[解決済み] TypeScriptでenumのバリアントはどのように動作するのですか?
-
[解決済み] Enumに関数を追加する
-
[解決済み] Dartは列挙をサポートしていますか?
-
[解決済み] Rust では、enum の値を繰り返し処理する方法はありますか?