如何基于相同的键名在枚举之间映射?

时间:2019-04-21 14:13:14

标签: javascript typescript enums

我有两个具有相同键名的枚举,并且我希望能够使用一个枚举中的值来获取第二个枚举中的值。

一个例子是将服务器错误转换为应用程序中的客户端错误:

enum serverErrors {
  first = "server error 1",
  second = "server error 2",
  third = "server error 3"
}

enum clientErrors {
  first = "client error 1",
  second = "client error 2",
  third = "client error 3"
}

当前,我们正在使用如下功能:

function translate(s: string) {
    switch (s) {
        case serverErrors.first:
            return clientErrors.first;
            /// ...
    }
}

我希望能够执行上述操作,而无需手动指定每个键的含义-它应该根据键的名称发生。

我已经尝试过了:

type translator = {
  // Error: Type 'P' cannot be used to index type 'clientErrors'.
  [P in keyof typeof serverErrors]: clientErrors[P];
};

尽管我不确定如何从上面获取字符串值,即使它确实起作用。

我希望此代码能够正常工作:

const serverError = serverErrors.first;
const clientError = enumTranslator(serverError); // === clientError.first

1 个答案:

答案 0 :(得分:2)

由于两个枚举中的键相同,因此您可以使用相同的键进行索引。枚举是运行时的对象,因此您可以搜索一个枚举以查找值并索引到另一个枚举:

enum serverErrors {
    first = "server error 1",
    second = "server error 2",
    third = "server error 3"
}

enum clientErrors {
    first = "client error 1",
    second = "client error 2",
    third = "client error 3"
}

function translate<
    TSource extends Record<keyof TSource, string>,
    TTarget extends Record<keyof TSource, string>>(source: TSource, target: TTarget, s: string) {

    for (const key in source) {
        if (source[key] === s) {
            return target[key];
        }
    }
    throw new Error("Member not found");
}

let a = translate(serverErrors, clientErrors, serverErrors.first);
console.log(a);