1. ホーム
  2. enums

TypeScriptのパラメータとしてのEnum

2023-09-10 20:50:32

質問

パラメータの型をEnumに設定することはできないのでしょうか? このように。

private getRandomElementOfEnum(e : enum):string{
    var length:number = Object.keys(e).length;
    return e[Math.floor((Math.random() * length)+1)];
}

コンパイル時に以下のようなエラーが発生します。

引数式が期待されます。

any を使えば、すべて解決です。

private getRandomElementOfEnum(e : any):string{
    var length:number = Object.keys(e).length;
    return e[Math.floor((Math.random() * length)+1)];
}

このコードはうまく動作します。しかし、エレガントでタイプセーフではありません。

パラメータとしてenumを定義する可能性やちょっとした回避策はないのでしょうか?

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

TSの列挙型は共通の祖先やインターフェイスを継承しないため、パラメータが列挙型であることを確認することはできません。

TypeScriptは静的解析をもたらします。あなたのコードでは動的プログラミングで Object.keyse[dynamicKey] . ダイナミックコードの場合、タイプ any という型が便利です。

あなたのコードはバグだらけです。 length() が存在しない。 e[Math.floor((Math.random() * length)+1)] は文字列か整数を返し は列挙値を手動で設定することができます。 ...

以下は提案です。

function getRandomElementOfEnum<E>(e: any): E {
    var keys = Object.keys(e),
        index = Math.floor(Math.random() * keys.length),
        k = keys[index];
    if (typeof e[k] === 'number')
        return <any>e[k];
    return <any>parseInt(k, 10);
}

function display(a: Color) {
    console.log(a);
}

enum Color { Blue, Green };
display(getRandomElementOfEnum<Color>(Color));

理想的には、パラメータ型 any で置き換える必要があります。 typeof E に置き換えるべきですが、コンパイラ (TS 1.5) はこの構文を理解できません。