网站搜索

在 TypeScript 中根据值获取枚举的键


我有以下枚举

export enum Operators {
    Equal = "1",
    NotEqual = "2",
    GreatherOrEqual = "3",
    LessOrEqual = "4",
    Contains = "5",
    Null = "6",
    NotNull = "7",
    Between = "8",
    StartsWith = "9",
    EndsWith = "10"
}

我需要从存储的值中恢复枚举键。我已经创建了以下内容:

GetEnumTextByValue ( valueOperator: string ): string {
    const values: string[] = Object.values( Operators ).filter( v => v == v );
    const keys: string[] = Object.keys( Operators ).filter( k => k == k );
    const index: number = values.indexOf( valueOperator );
    return keys[ index ];
}

这个函数返回了我需要的内容,但有没有更简单的方法来获取这个键?

答案#1

我正在为任何枚举使用这个函数

export function getEnumKeyByEnumValue(myEnum: any, enumValue: number | string): string {
  let keys = Object.keys(myEnum).filter((x) => myEnum[x] == enumValue);
  return keys.length > 0 ? keys[0] : '';
}

使用 jest 进行测试

describe('enum', () => {
  enum TestEnumWithNumber {
    ZERO
  }

  enum TestEnumWithString {
    ZERO = 'ZERO'
  }

  it('should return correct key when enum has number values', function () {
    const key = getEnumKeyByEnumValue(TestEnumWithNumber, TestEnumWithNumber.ZERO);
    expect(key).toBe('ZERO');
  });

  it('should return correct key when enum has string values', function () {
    const key = getEnumKeyByEnumValue(TestEnumWithString, TestEnumWithString.ZERO);
    expect(key).toBe('ZERO');
  });
});

答案#2

你可以结合使用 Object.entries 和 Map:

const operators = new Map(
  Object.entries(Operators)
    .map(entry => entry.reverse()) as [Operators, keyof typeof Operators][]
);

console.log(
  operators.get(Operators.Between) // Between
)

请注意,当你的枚举包含数字而不是字符串时,这更容易做到。

export enum Operators {
    Equal = 1,
    NotEqual = 2,
    GreatherOrEqual = 3,
    LessOrEqual = 4,
    Contains = 5,
    Null = 6,
    NotNull = 7,
    Between = 8,
    StartsWith = 9,
    EndsWith = 10
}

Operators[Operators.Between]; // "Between"