Перегрузки и обратные вызовы на TypeScript - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь использовать шаблон компоновщика и имею функции, которые поддерживают необязательные параметры в качестве параметров. И используйте что-то вроде этого:

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;
}

Я также проверил эту ссылку: https://www.typescriptlang.org/docs/handbook/functions.html

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Если вы хотите, чтобы у вашего метода 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();

или как: х (у, г); Если y и z не определены, то это одно и то же.

0 голосов
/ 09 мая 2018

Во время выполнения вы не можете отличить сигнатуры функций.Function имеет свойство length, которое может определять количество параметров функции, и вы можете использовать это для различения функций с разным количеством аргументов, но помните, что существует ошибка вокругсвойство length и необязательные параметры при переносе в ES5.

Суть в том, что не имеет значения, принимает функция параметры или нет, вы можете просто передать все поддерживаемые параметры и, еслиФункция использует их, что хорошо, а если нет, то тоже хорошо, никакого вреда не будет:

class MyClass {

    public OnAction(actions: Actions, x: (y?:any, z?:any) => void) {
        // We pass both arguments
        // argument values are null for demo, you can replace with actual parameters 
        x(null, null); 
     }
}

new MyClass().OnAction(Actions.add, ()=> {})// fine arguments passed but unused
new MyClass().OnAction(Actions.add, (vm)=> { console.log(vm) })// one argument used
new MyClass().OnAction(Actions.add, (vm, c)=> { console.log(vm);  console.log(c)})// both argument used
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...