1. ホーム
  2. enums

[解決済み] Enumに関数を追加する

2022-12-02 07:24:53

質問

TypeScriptでEnum型に関数を追加することは可能でしょうか?

例えば

enum Mode {
    landscape,
    portrait,

    // the dream...
    toString() { console.log(this); } 
}

または

class ModeExtension {
    public toString = () => console.log(this);
}

enum Mode extends ModeExtension {
    landscape,
    portrait,
}

もちろん toString() のような関数が含まれるでしょう。 switch しかし、ユースケースは次のような流れになるでしょう。

class Device {
    constructor(public mode:Mode) {
        console.log(this.mode.toString());
    }
}

を拡張する理由は理解できました。 enum を拡張することが奇妙なことであるかもしれない理由は理解できますが、ただそれが可能かどうか疑問に思っています。

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

Enumとは別のクラスを用意し、それを使って欲しいものを取得するか、名前空間をEnumにマージして、同じ場所のように見えるところで全てを取得するかのどちらかでしょう。

モード・ユーティリティ・クラス

これは正確にあなたが求めているものではありませんが、これは静的メソッドを使用して"Mode to string"の動作をカプセル化することを可能にします。

class ModeUtil {
    public static toString(mode: Mode) {
        return Mode[mode];
    }
}

このように使うことができます。

const mode = Mode.portrait;
const x = ModeUtil.toString(mode);
console.log(x);

モード列挙/名前空間マージ

追加のメソッドを持つEnumのように見えるものを作成するために、Enumと名前空間をマージすることができます。

enum Mode {
    X,
    Y
}

namespace Mode {
    export function toString(mode: Mode): string {
        return Mode[mode];
    }

    export function parse(mode: string): Mode {
        return Mode[mode];
    }
}

const mode = Mode.X;

const str = Mode.toString(mode);
alert(str);

const m = Mode.parse(str);
alert(m);