Перечисление Typescript, интерфейс и отображение - PullRequest
0 голосов
/ 27 апреля 2018

В TypeScript, в массиве или аналогичной структуре данных, как я могу сопоставить строку с идентификатором, гарантируя, что разрешен только определенный диапазон идентификаторов?

Вот что я хочу сделать. Это отлично работает. Однако мне интересно, есть ли более краткий способ достижения этого?

enum ETypeId {
    alpha  = "a",
    beta   = "b",
    gamma  = "g"
}

interface IType {
    id:     ETypeId,
    title:  string,
}

myTypes: IType[] = [
    { id: ETypeId.alpha, title: "Alpha" },
    { id: ETypeId.beta,  title: "Beta"  },
    { id: ETypeId.gamma, title: "Gamma" }
];

Как есть, я должен сделать следующее, чтобы перейти от id к title:

function getTypeForTypeId( typeId: ETypeId ): IType {
    return myTypes.find( type => type.id == typeId );
}

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


Пояснение:

  • "a" - это то, что хранится в моей базе данных
  • ETypeId.alpha - это способ доступа к нему в моем коде
  • "Alpha" - это то, что отображается пользователю.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Согласитесь с Сержи Доте Тейксидором ответ, что Карта - лучший вариант для решения такой проблемы. Однако, исходя из описанной проблемы, я думаю, что она может быть упрощена до Map<ETypeId, string>:

enum ETypeId {
    alpha  = "a",
    beta   = "b"
}

const types: Map<ETypeId, string> = new Map( [
   [ ETypeId.alpha, "Alpha" ],
   [ ETypeId.beta, "Beta" ],
]);

На всякий случай, если вы хотите инициализировать свою структуру один раз и заставить TypeScript защитить вас от изменения значений внутри вашей карты:

enum ETypeId {
    alpha  = "a",
    beta   = "b"
}

interface ReadonlyMap<TKey, TValue> {
    get(key: TKey):TValue;
}

const types: ReadonlyMap<ETypeId, string> = new Map( [
   [ ETypeId.alpha, "Alpha" ],
   [ ETypeId.beta, "Beta" ],
]);

// Static analyzer error if you try to change the value:
types.set(ETypeId.alpha, "NewValue");
0 голосов
/ 27 апреля 2018

Вы можете использовать карту:

  1. Вы можете напрямую получить любой элемент
  2. Вы можете зациклить все элементы, если хотите

пример:

enum ETypeId {
    alpha  = "a",
    beta   = "b",
    gamma  = "g"
}

interface IType {
    id:     ETypeId,
    title:  string,
}

const myMap: Map<string, IType> = new Map( [
   [ ETypeId.alpha,  { id: ETypeId.alpha, title: "Alpha" } ],
   [ ETypeId.beta,  { id: ETypeId.beta,  title: "Beta"  } ],
   [ ETypeId.gamma, { id: ETypeId.gamma, title: "Gamma" } ]
]);

console.log(myMap.get(ETypeId.alpha)) // -> {id: "a", title: "Alpha"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...