避免为可选参数传递 undefined

Dav*_*ark 5 parameters undefined typescript

如果我有一个带有n可选参数的构造函数并且我只想为最后一个可选参数传递一个值,我必须传递undefined n-1时间。

例如:

class House() {
    constructor(door?, roof?, windows?) { }
}
Run Code Online (Sandbox Code Playgroud)

如果我想实例化一个House没有 adoor或 aroof但有的new windows,我必须undefined两次传递给构造函数:

let myHouse = new House(undefined, undefined, new Windows());
Run Code Online (Sandbox Code Playgroud)

C# 有命名参数,这在这里很理想。

undefined n-1在这种情况下,我如何避免通过时间?

Dan*_*ies 5

最常用的方法是参数对象。您可以使用一个参数,而不是使用三个参数:

interface HouseOptions {
    door?: Door;
    roof?: Roof;
    windows?: Windows;
}

class House() {
    constructor(options: HouseOptions) {...}
}
Run Code Online (Sandbox Code Playgroud)

现在你可以创建一个这样的房子: new House({windows: new Windows()})

这比命名参数更灵活:考虑这样一种情况:您希望允许有窗户和门的房屋或有窗户和屋顶的房屋,但不允许只有屋顶的房屋。对于这种情况,您可以执行以下操作:

interface DoorlessHouseOptions {
    roof: Roof;
    windows: Windows;
}

interface RooflessHouseOptions {
    door: Door;
    windows: Windows;
}

class House() {
    constructor(options: DoorlessHouseOptions | RooflessHouseOptions) {...}
}
Run Code Online (Sandbox Code Playgroud)

这以类型安全的方式强制您的房子有门或屋顶(以及窗户),这会因命名参数而变得复杂。在某些语言中,这可以通过方法重载来解决,但由于 Javascript 不允许方法重载,因此选项对象通常是要走的路。

另一种不太常用的方法是Builder 模式