首页 > 解决方案 > Typescript 枚举、接口和映射

问题描述

在 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" }
];

照原样,我必须执行以下操作才能从idtitle

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

我可以使用不同的数据结构来使上面的一些代码更简洁,或者这已经和它一样好了吗?


解释:

标签: typescript

解决方案


同意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");

推荐阅读