2017-07-31 28 views
0

如果我有了n可选参数的构造函数,我想传递一个值只有最后可选参数,我必须要通过undefinedn-1倍。避免将未定义的可选参数

例如:

class House() { 
    constructor(door?, roof?, windows?) { } 
} 

如果我要实例化一个新的House不具有doorroof但是拥有windows,我必须通过undefined两次构造函数:

let myHouse = new House(undefined, undefined, new Windows()); 

C#有named parameters,这在这里很理想。

在这种情况下,如何避免通过undefinedn-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

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() });