Обратный вызов Typescript с неопределенными параметрами - PullRequest
0 голосов
/ 03 декабря 2018

У меня проблемы с передачей нескольких параметров через функцию обратного вызова.По какой-то причине один из объектов не определен.

Как определить функции обратного вызова с несколькими параметрами?

  public save() {
    let oldStartDate = "2019-01-01";

    let newProject = new Project();
    newProject.oldStartDate = "2018-01-01";

    this.doSomeWork(newProject, this.workFinished_Callback.bind(this), oldStartDate);
  }

  public doSomeWork(project:Project, callback: (updatedProject: Project, ...param: any[]) => any = null, ...callbackArgs: any[]) {
    //Work work..
    console.log(project); //This exists..

    callback.call(project, ...callbackArgs);
  }

  public workFinished_Callback(project:Project, oldStartDate: string) {
    console.log(project); //This is undefined..
    console.log(oldStartDate); //Shows 2018-01-01
  }

1 Ответ

0 голосов
/ 03 декабря 2018

Проблема в том, как вы используете call.Первым аргументом для вызова является параметр this, переданный функции, который, поскольку вы связываете обратный вызов, не будет доступен в обратном вызове.Вы можете передать null в качестве первого аргумента и передать проект в качестве второго аргумента и распространить остальные аргументы в качестве других аргументов:

callback.call(null, project, ...callbackArgs);

Лучшим подходом было бы не использовать вызов.Вы можете просто вызвать функцию, как обычно:

callback(project, ...callbackArgs);

Вы также можете создать полностью безопасную версию своего кода.В 3.2 bind правильно набирается, если вы включите strictBindCallApply (читай PR ).Это означает, что мы можем использовать bind и получить правильно напечатанную функцию.Соедините это с кортежами в параметрах отдыха ( PR ), и мы сможем заставить компилятор полностью проверить нас:

class Project { oldStartDate!: string }
type DoSomeworkCallbackArgs<T extends (updatedProject: Project, ...param: any[]) => any> =
    T extends (updatedProject: Project, ...param: infer A) => any ? A : []
class DD {
    public save() {
        let oldStartDate = "2019-01-01";

        let newProject = new Project();
        newProject.oldStartDate = "2018-01-01";

        this.doSomeWork(newProject, this.workFinished_Callback.bind(this), oldStartDate);
        this.doSomeWork(newProject, this.workFinished_Callback.bind(this), 0); //error
    }

    public doSomeWork<T extends null | ((updatedProject: Project, ...param: any[]) => any)>(project: Project, callback: T = null, ...callbackArgs: DoSomeworkCallbackArgs<T>) {
        //Work work..
        console.log(project); //This exists..
        if (callback) callback(project, ...callbackArgs);
    }

    public workFinished_Callback(project: Project, oldStartDate: string) {
        console.log(project); // ok now
        console.log(oldStartDate); //Shows 2018-01-01

    }
}


new DD().save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...