Typescript枚举、接口和映射

14

在 TypeScript 中,如何将字符串映射到 ID,并确保只允许特定范围的 ID 在数组或类似数据结构中进行?

我想做的事情在这里是有效的。但是,我想知道是否有更简洁的方法来实现这一点?

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个回答

14

我同意Sergi Dote Teixidor的答案,认为Map是解决这个问题的最佳选择。然而,根据所描述的问题,我认为可以简化为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");

11

你可以使用地图:

  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"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接