我有这个代码
export interface CommonAnimalProps {
name: string
}
export interface DogResponse extends CommonAnimalProps {
}
export interface CatResponse extends CommonAnimalProps {
color: string,
}
export type AllAnimals = (DogResponse[] | CatResponse[])
export interface AllAnimalsProps {
height: number | null,
errorCodes: number[] | null,
uuid?: string,
[ANIMALS.dog]?: DogResponse[],
[ANIMALS.cat]?: CatResponse[],
}
export enum ANIMALS {
dog = 'dog',
cat = 'cat'
}
export const transformCalculatedEmissionsResponse = (response: AllAnimalsProps): AllAnimals => {
const result: AllAnimals = [];
(Object.values(ANIMALS) as ANIMALS[]).map(animal => {
const bars = response[animal]
if (Array.isArray(bars)) {
bars.map(bar => result.push(bar))
}
})
return result
}
并且它在这条线上失败了
bars.map(bar => result.push(bar))
无结果 类型为“DogResponse | CatResponse”的参数无法分配给类型为“CatResponse”的参数。类型为“DogResponse”的参数缺少属性“color”,但类型为“CatResponse”的参数是必需的。
为什么以及如何解决这个问题?
这里是广场
问题是,你的结果属于类型
AllAnimals
,这最终意味着即,它要么
DogResponse[]
是只能容纳狗的,CatResponse[]
要么是只能容纳猫的。另一方面,在迭代枚举值时,您
bars
将同时出现一次 aDogResponse[]
和一次 a ,CatResponse[]
并且您尝试将所有值推送到同一个result
数组中,这是不可能的。如果你想要一个混合数组,那么定义
AllAnimals
为这
result
意味着这意味着它将是一个数组,其中每个元素要么是 a,
CatResponse
要么是 aDogResponse
顺便说一句,
bars.map(bar => result.push(bar))
这没什么意义。使用反而。
一般来说,只使用迭代器来迭代数组的值是一个坏习惯
map
。当你不需要map
创建的结果数组时,可以使用forEach
或简单的for .. of
循环既然您在评论中澄清了您的问题和先决条件,您可以例如这样做
即,迭代不同类型的动物,一旦在响应中找到相应的值,就返回它。如果没有找到,则返回一个空数组(与你目前所做的相同)。
我认为,这里,
result
可以是对象数组DogResponse
或对象数组CatResponse
,但不能同时是两者,因为它的类型为AllAnimals
。当您推送任一结果时,它都会出现错误,因为它们都不匹配另一个,具体来说,DogResponse 可能与 CatResponse 的结构不匹配,反之亦然。
为了修复这个问题,您可以调整的类型
result
,以便它可以在单个数组中接受DogResponse
和类型。CatResponse
修复你
transformCalculatedEmissionsResponse
如下:希望这有帮助!