深嵌套数组的TypeScript接口
我对Typescript完全陌生,在其他领域也取得了一些进展,但我正在努力为具有“taskName”和“totaltaskhurs”的深度嵌套对象创建接口。数据如下所示:深嵌套数组的TypeScript接口,typescript,Typescript,我对Typescript完全陌生,在其他领域也取得了一些进展,但我正在努力为具有“taskName”和“totaltaskhurs”的深度嵌套对象创建接口。数据如下所示: [ { "20229622": [ { "taskName": "Project Management", "totalTaskHours": "1589.4" }, { "taskName": "M
[
{
"20229622": [
{
"taskName": "Project Management",
"totalTaskHours": "1589.4"
},
{
"taskName": "Marketing",
"totalTaskHours": "1306.8"
},
{
"taskName": "Design",
"totalTaskHours": "212.4"
},
{
"taskName": "Programming",
"totalTaskHours": "415.8"
}
]
},
{
"20229623": [
{
"taskName": "Project Management",
"totalTaskHours": "980.1"
},
{
"taskName": "Marketing",
"totalTaskHours": "717.3"
},
{
"taskName": "Design",
"totalTaskHours": "468.9"
}
]
},
{
"20229624": [
{
"taskName": "Programming",
"totalTaskHours": "5930.1"
},
{
"taskName": "Project Management",
"totalTaskHours": "997.2"
},
{
"taskName": "Marketing",
"totalTaskHours": "2108.69"
},
{
"taskName": "Design",
"totalTaskHours": "529.2"
}
]
}
]
我试图深入到嵌套数组中的对象,但每次都会出错
我尝试了以下方法(显然是错误的):
我也尝试了以下方法,但数据太浅:
interface TaskItem {
taskName: string;
totalTaskHours: string;
}
interface TaskBreakdownSummedByCategory {
[key:string]: TaskItem;
}
有人能帮我解决这个问题吗?我仍在学习,但基本教程并不真正涉及深嵌套对象。谢谢 你真的很接近。由于外部数组是一个数组,因此您只需定义其元素的类型(
TaskItemHolder
如下):
那么整个数组的类型是TaskItemHolder[]
这就是说,上面将允许在TaskItemHolder
上使用多个属性,而不仅仅是一个属性。正如我在评论中提到的,如果你能改变结构,我会的。让一个对象具有一个名称不同的属性不是一个好主意(即使不使用静态类型,但特别是在使用静态类型时)
如果要循环遍历该数据,由于存在问题的结构,您可能会使用
Object.keys(…)[0]
来获取一个属性的键(或Object.entries(…)[0]
来获取键和值,或仅使用Object.values(…)[0]
来获取值):
或者,如果持有者中可能存在其他属性,则只需使用该键/条目/值数组:
for (const holder of data) {
for (const [key, value] of Object.entries(holder)) {
console.log("Holder with key " + key + ":");
for (const entry of value) {
console.log(entry.taskName);
}
}
}
这是一个非常不幸的数据结构(那些属性名称不同的对象)。你有选择改变它吗?不幸的是,我没有选择改变。这是API调用的JSON对象响应。感谢您的快速回复。我也尝试过这种方法,但是第2项和第3项的键是“undefined”,而不是{taskName:string;totaltaskhurs:string;}。@technicacreativejp-我不明白你的意思,你说的“第2项和第3项”是什么意思?数据中每个持有者正好有一个项目数组,该数组中的条目没有定义。{code>未定义。{code>当我添加[]:Type'({“20229622”:{taskName:string;totaltaskhurs:string;}[];“20229623”?:未定义;“20229624”?:未定义;}{“20229623”:{taskName:string;totaltaskhurs:string;}[];“20229622”?:未定义;“20229624”?:未定义;}{…}][]不可分配给类型“TaskBreakdownsumedByCategory[]”。属性“20229623”与索引签名不兼容。类型“undefined”不可分配给类型“TaskItem[]”。@technicacreativejp-您不需要
TaskBreakdownsumedByCategory
(即,对于您显示的数据结构),只需要答案中显示的内容。如果您还需要taskbreakdownsumedbycategory
,请说明您需要它做什么以及如何使用它。
interface TaskItem {
taskName: string;
totalTaskHours: string;
}
interface TaskItemHolder {
[key: string]: TaskItem[];
}
for (const holder of data) {
const key = Object.keys(holder)[0];
console.log("Holder with key " + key + ":");
for (const entry of holder[key]) {
console.log(entry.taskName);
}
}
for (const holder of data) {
for (const [key, value] of Object.entries(holder)) {
console.log("Holder with key " + key + ":");
for (const entry of value) {
console.log(entry.taskName);
}
}
}