【发布时间】:2021-03-17 08:49:23
【问题描述】:
在@ts-ignore 之后的行中,我将一个新的键值对添加到以前看起来像这样的对象:{id:string, text:string}
如您所见:
Webstorm 告诉我类型应该是{id:string, text:string}
我想知道,为什么 TypeScript 坚持这一点? 我从未声明对象必须只有这两个值。
代码和背景
const goals = COURSE_DATA.map((course) => {
// @ts-ignore
course.goals.forEach(g => g.course = course.title)
return course.goals;
}).reduce((accGoals, curGoals) => {
let updatedGoals = curGoals;
for (let goal of curGoals){
updatedGoals.concat(goal);
}
return accGoals.concat(updatedGoals);
}, [])
此函数的目的是从其父 Course 对象中获取目标对象数组,并将它们覆盖到目标对象数组中。 基本上把[{[{}]}]转为[{}]
仅供参考,这是父对象数组的一个峰值:
const COURSE_DATA = [
{
id: 'c1', title: 'Ionic + React - The Practical Guide', enrolled: new Date("03/05/2121"), goals: [{
id: "c1g1",
text: "Complete Course"
}, {
id: "c1g2",
text: "Learn Something"
}]
},
]
后来,我决定最终的目标数组需要包含每个目标的父课程名称:
// @ts-ignore
course.goals.forEach(g => g.course = course.title)
代码使用@ts-ignore 就是这样做的,但我想了解为什么 TypeScript 会抱怨,对象中当然没有键,为什么显然应该有。
【问题讨论】:
-
附带说明:
updatedGoals.concat(goal);不会做任何事情。它结合了两个数组,但它只返回一个新数组。但是,该数组从未使用过,因此被丢弃了。 -
之前,我只有 ´´´return updatedGoals;´´´ 但这导致最终的目标数组只有最后一个父对象(课程)的目标。
-
在尝试重新创建它时,我还在 for 循环中尝试了
updatedGoals = updatedGoals.concat(goal);......但这只会导致最终目标数组具有最后一门课程的目标两次。我很想知道为什么。