我从服务器以这种形式收到一些参考数据:
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#中要做的,所以我觉得很自在:)
答案 0 :(得分:1)
最简单的方法如下:
interface Descriptions {
[index: number]: string;
}
interface Statuses {
descriptions: Descriptions;
[index: string]: number;
}
let statuses: Statuses = {descriptions: {}}
这样,您将可以分别使用任意字符串和数字键查询statuses
和statuses.descriptions
。我会尝试使用symbols进行一些改进,但似乎TS尚不支持将它们作为键。
答案 1 :(得分:0)
这使得通过“代码”(即,象征性地)引用记录变得容易,而不是在设置外键等时假设数据库中记录的ID。
如果您希望能够编写statuses.ONE_STATUS
,则statuses
必须是一个枚举。例如
enum statuses {
ONE_STATUS;
}