避免为可选参数传递undefined

时间:2017-07-31 12:45:24

标签: typescript parameters undefined

如果我的构造函数具有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()); 次?

2 个答案:

答案 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