在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" }
];
Run Code Online (Sandbox Code Playgroud)
就目前而言,我必须执行以下操作才能从id到达title:
function getTypeForTypeId( typeId: ETypeId ): IType {
return myTypes.find( type => type.id == typeId );
}
Run Code Online (Sandbox Code Playgroud)
我是否可以使用其他数据结构,使上面的某些代码更简洁,还是已经足够好了?
说明:
"a" 是什么存储在我的数据库中ETypeId.alpha 是我在代码中访问它的方式"Alpha" 显示给用户的是什么。小智 8
你可以使用地图:
例子:
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"}
Run Code Online (Sandbox Code Playgroud)
同意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" ],
]);
Run Code Online (Sandbox Code Playgroud)
万一您想一次初始化结构并使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");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9367 次 |
| 最近记录: |