从TypeScript中的数据库枚举

时间:2018-08-22 22:37:09

标签: typescript

我从服务器以这种形式收到一些参考数据:

interface Status {
    id: number;
    code: string;
    description: string;
}

在JavaScript中,通过执行以下操作,我会将其转换为枚举样式中可以引用的内容:

let as = resp.data as Status[];
let statuses: any = {};
statuses.descriptions = {};

for (let a of as) {
   statuses[a.code] = a.id;
   statuses.descriptions[a.id] = a.description;
}

这可以让我写:

statuses.ONE_STATUS

,我将获得记录的ID。这样一来,设置外键等时,就可以轻松地通过记录的“代码”(即,象征性地)引用记录,而无需假设数据库中记录的ID。

现在,我将其转换为TypeScript,无法弄清楚如何编写此代码,并且不对状态使用任何类型。

有什么建议吗?

---更新---

似乎我不能完全得到我想要的东西,但是我可以做到:

interface Status {
    id: number;
    description: string;
}

interface Statuses {
    [statusIndex: string]: Status;
}

然后我可以用这个填充:

let statuses: Statuses;

for (let a of as) {
    statuses[a.code].id = a.id;
    statuses[a.code].description = a.description;
}

并不能完全满足我的要求,但是可以做到:

statuses.ONE_STATUS.id or statuses["ONE_STATUS"].id

获取ID,并且

statuses.ONE_STATUS.description

以获取描述。

字典方法是我在C#中要做的,所以我觉得很自在:)

2 个答案:

答案 0 :(得分:1)

最简单的方法如下:

interface Descriptions {
    [index: number]: string;
}

interface Statuses {
    descriptions: Descriptions;
    [index: string]: number;
}

let statuses: Statuses = {descriptions: {}}

这样,您将可以分别使用任意字符串和数字键查询statusesstatuses.descriptions。我会尝试使用symbols进行一些改进,但似乎TS尚不支持将它们作为键。

答案 1 :(得分:0)

  

这使得通过“代码”(即,象征性地)引用记录变得容易,而不是在设置外键等时假设数据库中记录的ID。

如果您希望能够编写statuses.ONE_STATUS,则statuses必须是一个枚举。例如

enum statuses {
  ONE_STATUS;
}