Как иметь альтернативное определение строки для числового перечисления в машинописном тексте

У меня есть числовое перечисление, как показано ниже.

enum Rating {
  Unknown = 0,
  One,
  Two,
  Three,
  Four
}

Мне нужно получить альтернативное строковое значение перечисления, когда я обращаюсь к строке перечисления, как показано ниже.

var stringVal = Rating[Rating.One];

Приведенная выше строка должна дать мне «Рейтинг один» вместо «Один».

Мне нужно придерживаться числовых перечислений и не использовать строковые перечисления. Как только решение, о котором я мог подумать, это использовать массив строк, как показано ниже.

const stringRating = ["Unknown Rating", "Rating One", "Rating is Two", "Rating is Three", "Rating is Four"];
export function toString(rating: Rating): string {
return stringValues[rating];

Но есть ли лучший способ добиться этого в машинописном тексте?

Я ожидаю что-то вроде атрибута Description в С# для перечислений, как показано ниже.

public enum MyEnum 
{ 
  [Description("value 1")] 
  Value1, 
  [Description("value 2")]
  Value2, 
  [Description("value 3")]
  Value3
}

person PNDev    schedule 23.01.2019    source источник


Ответы (1)


Вы можете хранить строки перечисления в объекте Map:

ratingStrings = new Map<Rating,string>([
  [Rating.Unknown, "Unknown Rating"],
  [Rating.One, "Rating One"],
  [Rating.Two, "Rating is Two"],
  [Rating.Three, "Rating is Three"],
  [Rating.Four, "Rating is Four"],
]);

doSomething() {
  let str = this.ratingStrings.get(Rating.Unknown);
  ...
}

В качестве альтернативы, в случаях, когда формат строки одинаков для всех значений перечисления, вы можете использовать функцию, подобную следующей:

ratingToString(rating: Rating): string {
  return `Rating ${Rating[rating]}`;
}

doSomething() {
  let str = this.ratingToString(Rating.Unknown);
  ...
}

См. этот stackblitz для демонстрации обоих методы.

person ConnorsFan    schedule 23.01.2019