我尝试使用构建器模式,并且具有支持可选参数作为参数的函数。 并使用这样的东西:
new Service().OnAction(Actions.Add, () => { alert(1); })
.OnAction(Actions.Substract, () => { alert(1); })
.ServiceBuilder(serviceOptions);
new Service().OnAction(Actions.Add, (vm, container) => {
vm.FirstName = container.find("data-id=FirstName").val();
vm.LastName = container.find("data-id=LastName").val();
})
.OnAction(Actions.Substract, (vm, container) => { alert(1); })
.ServiceBuilder(serviceOptions);
这是我除了其他事情之外还尝试过的事情
public OnAction(actions: Actions, x: (y?:any, z?:any) => void) {
if (y != undefined && z != undefined) {
x(y, z);
}
else
x();
return this;
}
我还检查了此链接:Getting started with Material Components for Android
答案 0 :(得分:1)
在运行时,您无法真正区分功能签名。 Function
具有length
属性,可以确定函数的参数个数,您可以使用它来区分具有不同参数数量的函数,但要注意https://gist.github.com/robjhyndman/d9eb5568a78dbc79f7acc49e22553e96周围存在错误。转换为length
时的{1}}属性和可选参数。
关键是,如果函数接受或不接受参数应该无关紧要,你可以只传递所有支持的参数,如果函数使用它们就好了,如果不是那样也没关系,没有伤害:
ES5
答案 1 :(得分:1)
如果您希望方法OnAction
具有可选参数,则必须将检查未定义的逻辑提取到您传递给x
的方法。
这样的事情:
public OnAction(actions: Actions, x: (y?:any, z?:any) => void) {
x(y, z);
return this;
}
new Service().OnAction(Actions.Add, (vm, container) => {
if (vm === undefined && container === undefined) {
//some logic if undefined
return;
}
vm.FirstName = container.find("data-id=FirstName").val();
vm.LastName = container.find("data-id=LastName").val();
})
因为在您的情况下,如果您调用类似
的方法x
并不重要
x();
或者喜欢:
x(y,z);
如果y
和z
未定义,则它是相同的。