如果我的构造函数具有n
个可选参数,并且我只想传递 last 可选参数的值,那么我必须传递undefined
{{1时间。
例如:
n-1
如果我要实例化一个没有class House() {
constructor(door?, roof?, windows?) { }
}
或House
但确实有door
的新roof
,我必须通过{{1}两次到构造函数:
windows
C#有named parameters,这在这里是理想的。
如何在这种情况下避免传递undefined
let myHouse = new House(undefined, undefined, new Windows());
次?
答案 0 :(得分:2)
不是采用多个参数,而是采用单个选项对象参数。
interface HouseOptions {
door?: any;
roof?: any;
windows?: any;
}
class House() {
constructor(options: HouseOptions ) {
if(options.door) { ... }
if(options.roof) { ... }
if(options.windows) { ... }
}
}
let house = new House({ windows: new Windows() });
答案 1 :(得分:2)
最常用的方法是参数对象。您不必使用三个参数,而是使用一个参数:
interface HouseOptions {
door?: Door;
roof?: Roof;
windows?: Windows;
}
class House() {
constructor(options: HouseOptions) {...}
}
现在你可以创建一个这样的房子:new House({windows: new Windows()})
这比命名参数更灵活:考虑您想要允许拥有Windows和门的房屋或拥有Windows和屋顶的房屋,而不是只有屋顶的房屋。对于这种情况,您可以执行以下操作:
interface DoorlessHouseOptions {
roof: Roof;
windows: Windows;
}
interface RooflessHouseOptions {
door: Door;
windows: Windows;
}
class House() {
constructor(options: DoorlessHouseOptions | RooflessHouseOptions) {...}
}
这强制执行,你的房子有一个门或一个屋顶(以及Windows),以一种类型安全的方式,这将与命名参数复杂。在某些语言中,这可以通过方法重载来解决,但由于Javascript不允许方法重载,因此选项对象通常是可行的方法。
另一种不太常用的方法是Builder pattern。