Eu tenho essas interfaces
interface CommonAnimalProps {
common: {
size: number,
weight: number,
origin: string,
}
}
interface DogProps extends CommonAnimalProps {
name: string
}
interface CatProps extends CommonAnimalProps {
furious: boolean
}
interface BirdProps extends CommonAnimalProps {
canFly: boolean
}
export enum AnimalType {
dog = "dog",
cat = "cat",
bird = "bird",
}
export interface AnimalTypeToAnimalPropsMap {
[AnimalType.dog]: (DogProps)[],
[AnimalType.cat]: (CatProps)[],
[AnimalType.bird]: (BirdProps)[]
}
export type AllAnimalValues<T> = T[keyof T]
export type AllAnimalTypesArray = AllAnimalValues<AnimalTypeToAnimalPropsMap>
export type AllAnimalTypes = AllAnimalValues<AnimalTypeToAnimalPropsMap>[0]
export type AllAnimalTypesArrayDiscriminating = AllAnimalTypes[]
Isso AllAnimalTypesArrayDiscriminating
resulta em uma matriz parecida com esta
const foo: AllAnimalTypesArrayDiscriminating = [
{
name: "Bello",
common: {
size: 10,
weight: 25,
origin: "Knowhwere"
},
},
{
furious: true,
common: {
size: 3,
weight: 5,
origin: "Anywhere"
},
},
{
canFly: false,
common: {
size: 39,
weight: 50,
origin: "Somewhere"
},
},
]
É possível usar AllAnimalTypesArrayDiscriminating
e criar um novo tipo/interface a partir dele ( AllAnimalTypesArrayDiscriminatingModified
), onde cada elemento na matriz resultante bar
tem outro prop ( color: string
) adicionado para CommonAnimalProps
que o resultado fique assim
const bar: AllAnimalTypesArrayDiscriminatingModified = [
{
name: "Bello",
common: {
size: 10,
weight: 25,
origin: "Knowhwere",
color: 'red',
},
},
{
furious: true,
common: {
size: 3,
weight: 5,
origin: "Anywhere",
color: 'brown',
}
}, {
canFly: false,
common: {
size: 39,
weight: 50,
origin: "Somewhere",
color: 'white',
},
}
];
Observe que não posso modificar o original CommonAnimalProps
para adicionar color
como um parâmetro opcional. Também não posso editar DogProps, CatProps, BirdProps
. Estou procurando uma maneira que uses AllAnimalTypesArrayDiscriminating
(ou qualquer um dos outros tipos que não excluí) para adicionar esta propriedade. Existe uma maneira de fazer isso?