javascript - Parametrii furnizați nu corespund niciunei semnături a țintei de apel în metoda wrapper - Typescript
Ok, presupun că îmi scapă ceva foarte simplu în cazul ăsta.
Să zicem că am mai multe metode care repetă multe dintre aceleași lucruri astfel:
public getDepartments(id: number): ng.IPromise<IDepartmentViewModel[]> {
this.common.loadStart();
return this.unitOfWork.teamRepository.getDepartmentsForTeam(id).then((response: IDepartmentViewModel[]) => {
this.common.loadComplete();
return response;
}).catch((error) => {
this.common.loadReset();
return error;
});
}
Tone de cod standard pentru un singur apel la this.unitOfWork.teamRepository.getDepartmentsForTeam(id)
așa că am vrut să fac un înveliș generic pentru codul de bază, cum ar fi:
private internalCall<T>(method: () => ng.IPromise<T>): ng.IPromise<T> {
this.common.loadStart();
return method().then((response: T) => {
this.common.loadComplete();
return response;
}).catch((error) => {
this.common.loadReset();
return error;
});
}
Pe care aș putea să-l numesc atunci astfel:
public getDepartments(id: number): ng.IPromise<IDepartmentViewModel[]> {
return this.internalCall<IDepartmentViewModel[]>(this.unitOfWork.teamRepository.getDepartmentsForTeam(id));
Dar primesc următoarea eroare:
Supplied parameters do not match any signature of call target:
Type '() => ng.IPromise<IDepartmentViewModel[]>' requires a call signature, but type 'ng.IPromise<IDepartmentViewModel[]>' lacks one.
Care este modul corect de a transmite metoda mea în cealaltă pentru a o apela cu parametrii furnizați?
Răspuns #1
Aceasta este o greșeală frecventă: nu poți trece o funcție metodă ca funcție obișnuită deoarece necesită instanța clasei ca context. Soluția este să folosești o închidere:
function foo( func: () => any ) {
}
class A {
method() : any {
}
}
var instanceOfA = new A;
// Error: you need a closure to preserve the reference to instanceOfA
foo( instanceOfA.method );
// Correct: the closure preserves the binding to instanceOfA
foo( () => instanceOfA.method() );
Pentru un exemplu mai complet puteți vedea și fragmentul meu publicat aici: http://www.snip2code.com/Snippet/28601/Typescript--passing-a-class-member-funct
Răspuns #2
Trebuia să înfășor apelul, așa că a fost înfășurat într-o închidere astfel:
public getDepartments(id: number): ng.IPromise<IDepartmentViewModel[]> {
return this.internalCall<IDepartmentViewModel[]>(
() => { return this.unitOfWork.teamRepository.getDepartmentsForTeam(id); } // Wrapping here too
);
