TypeScriptで列挙キーと値文字列を取得する(逆マッピング)質問する

TypeScriptで列挙キーと値文字列を取得する(逆マッピング)質問する

列挙型があります:

export enum ApiMessages {
    logged_ok = 'Logged OK',
    register_ok = 'Register OK'
}

列挙型をパラメータとして持つ関数があります:

export function responseOK(message: ApiMessages, result ?: any): ApiResponse {
    return {
        "status": "ok",
        "code": 200,
        "messageId": ApiMessages[message], <-- KO TS7015
        "message": message,
        "result": result
    };
}

私は次のように関数を呼び出します:

responseOK(ApiMessages.logged_ok, {user: userRes})

列挙キーと列挙文字列値を応答に返そうとしていますが、TS エラーが発生します。

TS7015: インデックス式が 'number' 型ではないため、要素は暗黙的に 'any' 型を持ちます。

厳密な TypeScript 構成があります。suppressImplicitAnyIndexErrors を追加することはできません。

TypeScript バージョン: 2.9.2

ベストアンサー1

で説明したようにハンドブック:

文字列列挙型のメンバーには逆マッピングはまったく生成されないことに注意してください。

つまり、あなたのケースでは単純な逆マッピングは存在しないということです。

回避策: 文字列列挙型メンバーの逆マッピングを取得する

列挙型メンバーのキーをその値で取得するには、列挙型キーを反復処理し、関連付けられている値をターゲット値と比較する必要があります。

function getEnumKeyByEnumValue(myEnum, enumValue) {
    let keys = Object.keys(myEnum).filter(x => myEnum[x] == enumValue);
    return keys.length > 0 ? keys[0] : null;
}

enumこれをより厳密に次のように入力することもできます (ここでは、キーと値が両方とも文字列であるインデックス可能な型として解釈できることに注意してください)。

function getEnumKeyByEnumValue<T extends {[index:string]:string}>(myEnum:T, enumValue:string):keyof T|null {
    let keys = Object.keys(myEnum).filter(x => myEnum[x] == enumValue);
    return keys.length > 0 ? keys[0] : null;
}

デモコードをいくつか紹介します。TypeScript Playgroundで実際に動作を確認してください

enum ApiMessages {
    logged_ok = 'Logged OK',
    register_ok = 'Register OK'
}

let exampleValue = ApiMessages.logged_ok;
let exampleKey = getEnumKeyByEnumValue(ApiMessages, exampleValue);

alert(`The value '${exampleValue}' has the key '${exampleKey}'`)

function getEnumKeyByEnumValue<T extends {[index:string]:string}>(myEnum:T, enumValue:string):keyof T|null {
    let keys = Object.keys(myEnum).filter(x => myEnum[x] == enumValue);
    return keys.length > 0 ? keys[0] : null;
}

これをあなたのコードに追加すると、responseOK()次のようになります。

function responseOK(message: ApiMessages, result ?: any) {
    return {
        "status": "ok",
        "code": 200,
        "messageId": getEnumKeyByEnumValue(ApiMessages, message),
        "message": message,
        "result": result
    };
}

おすすめ記事