/**
* Your domain model.
*/
type Engine = {};
type Wheel = {};
type SteeringWheel = {};
type Chassis = {};
type Seat = {};
interface Car {
engine: Engine;
wheels: Wheel[];
steeringWheel: SteeringWheel;
chassis: Chassis;
seats: Seat[];
}
/**
* Enhancers.
*/
const addWheels = <T extends Partial<Car>>(base: T): T & { wheels: Wheel[] } => {
return Object.assign({}, base, { wheels: [] });
}
const addSeats = <T extends Partial<Car>>(base: T): T & { seats: Seat[] } => {
return Object.assign({}, base, { seats: [] });
}
/**
* Some seed for your car.
*/
const base = {
engine: {},
steeringWheel: {},
chassis: {},
}
/**
* Our assembly line.
*/
const main: Car[] =
[base]
.map(addSeats)
.map(addWheels)