TypeScript上的重载和回调

时间:2018-05-09 14:16:17

标签: typescript callback operator-overloading

我尝试使用构建器模式,并且具有支持可选参数作为参数的函数。 并使用这样的东西:

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

2 个答案:

答案 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); 如果yz未定义,则它是相同的。