Проблема в том, как вы используете 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()