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