Eu tenho esse código
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
}
e falha nessa linha
bars.map(bar => result.push(bar))
Nenhum resultado O argumento do tipo 'DogResponse | CatResponse' não é atribuível ao parâmetro do tipo 'CatResponse'. A propriedade 'color' está ausente no tipo 'DogResponse', mas é necessária no tipo 'CatResponse'.
Por que e como resolver isso?
Aqui está um parque infantil
O problema é que seu resultado é do tipo
AllAnimals
que no final significa que éou seja, é um
DogResponse[]
que só pode conter cães ou umCatResponse[]
que só pode conter gatos.Por outro lado, ao iterar sobre seus valores de enumeração, você
bars
será ambos, uma vez aDogResponse[]
e uma vez aCatResponse[]
, e estará tentando colocar todos os valores no mesmoresult
array, o que não é possível.Se você quiser uma matriz mista, defina seu
AllAnimals
comoo que significa que
result
seráo que significa que será uma matriz, onde cada elemento é um
CatResponse
ou umDogResponse
A propósito,
bars.map(bar => result.push(bar))
não faz muito sentido. Useem vez de.
Geralmente, é um mau hábito usar
map
apenas para iterar sobre valores o array. Quando você não precisa do array resultante quemap
cria, use um ou um loopforEach
simplesfor .. of
Agora que você esclareceu seu problema e pré-condições nos comentários, você poderia, por exemplo, fazer assim
Ou seja, itere sobre seus diferentes tipos de animais e, uma vez que você encontrar o respectivo valor em sua resposta, retorne-o. Se nenhum for encontrado, apenas retorne um array vazio (o mesmo que você já faz atualmente).
Acho que aqui
result
pode ser um array deDogResponse
objetos ou um array deCatResponse
objetos, mas não ambos porque é digitado comoAllAnimals
.E quando você pressiona qualquer um dos resultados, ocorre um erro porque nenhum deles corresponde ao outro, especificamente, um DogResponse pode não corresponder à estrutura de um CatResponse, e vice-versa.
Para corrigir isso, você pode ajustar a digitação de
result
para que ele possa aceitar os tiposDogResponse
eCatResponse
em uma única matriz.Corrija você
transformCalculatedEmissionsResponse
da seguinte forma:Espero que isso ajude!