2017-07-31 68 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() });