Tengo una variedad de vehículos como a continuación.
export const fetchDataFromApi = () => { return [ { vehicleId: 1, vehicleType: 'car', seats: 4, wheelType: 'summer', updatedAt: new Date().toISOString }, { vehicleId: 2, vehicleType: 'plane', seats: 200, maxAltitude: 8000, updatedAt: new Date().toISOString }, { vehicleId: 3, vehicleType: 'train', seats: 1200, railType: 'whatever', updatedAt: new Date().toISOString }, ]; };He creado clases de Vehículo, Coche, Avión y Tren. Pero no estoy seguro, esos también podrían ser Interface.
Esta respuesta de API debe manejarse con un DTO que define el tipo de respuesta y permite convertir la respuesta en el tipo DTO.
Entonces, ¿cómo puedo transformar los datos en un DTO escrito? A continuación se muestran las definiciones de mi clase, pero no estoy seguro de cómo implementarlas.
class Vehicle { vehicleId: number; vehicleType: string; seats: number; updatedAt: string; constructor(vehicleId: number, vehicleType: string, seats: number, updatedAt: string) { this.vehicleId = vehicleId; this.vehicleType = vehicleType; this.seats = seats; this.updatedAt = updatedAt; } } class Car extends Vehicle { wheelType: string; constructor(vehicleId: number, vehicleType: string, seats: number, updatedAt: string, wheelType: string) { super(vehicleId, vehicleType, seats, updatedAt); this.wheelType = wheelType; } } class Plane extends Vehicle { maxAltitude: number; constructor(vehicleId: number, vehicleType: string, seats: number, updatedAt: string, maxAltitude: number) { super(vehicleId, vehicleType, seats, updatedAt); this.maxAltitude = maxAltitude; } } class Train extends Vehicle { railType: string; constructor(vehicleId: number, vehicleType: string, seats: number, updatedAt: string, railType: string) { super(vehicleId, vehicleType, seats, updatedAt); this.railType = railType; } }Solo necesita crear un mapeador para transformar el conjunto de datos.
const fetchDataFromApi = (): Vehicle[] => { return [ { vehicleId: 1, vehicleType: 'car', seats: 4, wheelType: 'summer', updatedAt: new Date().toISOString }, { vehicleId: 2, vehicleType: 'plane', seats: 200, maxAltitude: 8000, updatedAt: new Date().toISOString }, { vehicleId: 3, vehicleType: 'train', seats: 1200, railType: 'whatever', updatedAt: new Date().toISOString }, ]; }; class Vehicle { vehicleId: number; vehicleType: string; seats: number; updatedAt: string; constructor(vehicleId: number, vehicleType: string, seats: number, updatedAt: string) { this.vehicleId = vehicleId; this.vehicleType = vehicleType; this.seats = seats; this.updatedAt = updatedAt; } } class Car extends Vehicle { wheelType: string; constructor(vehicleId: number, vehicleType: string, seats: number, updatedAt: string, wheelType: string) { super(vehicleId, vehicleType, seats, updatedAt); this.wheelType = wheelType; } } class Plane extends Vehicle { maxAltitude: number; constructor(vehicleId: number, vehicleType: string, seats: number, updatedAt: string, maxAltitude: number) { super(vehicleId, vehicleType, seats, updatedAt); this.maxAltitude = maxAltitude; } } class Train extends Vehicle { railType: string; constructor(vehicleId: number, vehicleType: string, seats: number, updatedAt: string, railType: string) { super(vehicleId, vehicleType, seats, updatedAt); this.railType = railType; } } const vehicleMapper = (vehicle: Vehicle) => { const {vehicleId, vehicleType, seats, updatedAt} = vehicle; switch(vehicle.vehicleType) { case 'car': const {wheelType} = vehicle as Car; return new Car(vehicleId, vehicleType, seats, updatedAt, wheelType); case 'plane': const {maxAltitude} = vehicle as Plane; return new Plane(vehicleId, vehicleType, seats, updatedAt, maxAltitude); case 'train': const {railType} = vehicle as Train; return new Train(vehicleId, vehicleType, seats, updatedAt, railType); default: return new Vehicle(vehicleId, vehicleType, seats, updatedAt); } } const data = fetchDataFromApi(); const vehicles = data.map(vehicleMapper);