The most commonly used approach to this are parameter objects. Instead of using three parameters, you'd use one parameter:
interface HouseOptions {
door?: Door;
roof?: Roof;
windows?: Windows;
}
class House() {
constructor(options: HouseOptions) {...}
}
Now you can create a house like this: new House({windows: new Windows()})
This is even more flexible than named parameters: Consider the case where you want to allow Houses that have Windows and a Door OR have Windows and a Roof, but not houses that only have a roof. For this scenario, you can do something like this:
interface DoorlessHouseOptions {
roof: Roof;
windows: Windows;
}
interface RooflessHouseOptions {
door: Door;
windows: Windows;
}
class House() {
constructor(options: DoorlessHouseOptions | RooflessHouseOptions) {...}
}
This enforces, that your house either has a door or a roof (along with Windows), in a type safe way, which would be complicated with named parameters. In some languages this could be solved by method overloading, but since Javascript does not allow method overloading, options-objects are usually the way to go.
Another, less commonly used approach would be the Builder pattern.