1. ホーム
  2. javascript

[解決済み] ES6によるJavascriptの列挙

2022-02-19 14:37:57

質問

古いJavaプロジェクトをJavascriptで再構築しているのですが、JSでenumを行う良い方法がないことに気づきました。

私が思いつくベストは

const Colors = {
    RED: Symbol("red"),
    BLUE: Symbol("blue"),
    GREEN: Symbol("green")
};
Object.freeze(Colors);

constColors は再アサインされないようにし、フリーズすることでキーと値の変異を防ぎます。Symbolsを使っているので Colors.RED とは等しくありません。 0 またはそれ自身以外の何か。

この定式化には問題があるのでしょうか?もっと良い方法はないでしょうか?


(この質問は少し繰り返しになりますが、すべての 過去のQ&A はかなり古く、ES6ではいくつかの新しい機能が提供されています)。


EDITです。

もう一つの解決策は、シリアライズの問題に対処するものですが、レルムの問題が残っていると思います。

const enumValue = (name) => Object.freeze({toString: () => name});

const Colors = Object.freeze({
    RED: enumValue("Colors.RED"),
    BLUE: enumValue("Colors.BLUE"),
    GREEN: enumValue("Colors.GREEN")
});

値としてオブジェクト参照を使用することで、Symbolと同様の衝突回避が可能です。

解決方法は?

<ブロッククオート

この処方に問題はないのでしょうか?

ないですね。

<ブロッククオート

何か良い方法はないでしょうか?

2つの文を1つに折りたたむと

const Colors = Object.freeze({
    RED:   Symbol("red"),
    BLUE:  Symbol("blue"),
    GREEN: Symbol("green")
});

ボイラープレートが嫌いな人は、繰り返しのような Symbol を呼び出すことで、もちろんヘルパー関数 makeEnum は、名前のリストから同じものを作成します。