web-dev-qa-db-fra.com

Les paramètres fournis ne correspondent à aucune signature de la cible d'appel dans la méthode d'encapsulation - Typescript

Ok je suppose que je manque quelque chose de très simple sur celui-ci.

Disons que j'ai plusieurs méthodes qui répètent beaucoup de choses identiques, comme ceci:

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

Des tonnes de passe-partout pour un seul appel à this.unitOfWork.teamRepository.getDepartmentsForTeam(id)

alors je voulais faire un wrapper générique pour le passe-partout tel que:

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

Que je pourrais alors appeler comme: 

public getDepartments(id: number): ng.IPromise<IDepartmentViewModel[]> {
        return this.internalCall<IDepartmentViewModel[]>(this.unitOfWork.teamRepository.getDepartmentsForTeam(id));

Mais j'obtiens l'erreur suivante:

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.

Quel est le bon moyen de passer ma méthode à l'autre pour l'appeler avec les paramètres fournis?

15
John

J'avais besoin d'envelopper l'appel afin qu'il soit enveloppé dans une fermeture,

public getDepartments(id: number): ng.IPromise<IDepartmentViewModel[]> {
    return this.internalCall<IDepartmentViewModel[]>(
        () => { return this.unitOfWork.teamRepository.getDepartmentsForTeam(id); } // Wrapping here too
    );
3
John

C'est une erreur courante: vous ne pouvez pas passer une fonction de méthode en tant que fonction normale car elle nécessite l'instance de la classe en tant que contexte. La solution consiste à utiliser une fermeture: 

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

Pour un exemple plus complet, vous pouvez également voir mon extrait publié ici: http://www.snip2code.com/Snippet/28601/TypeScript--passing-a-class-member-funct

18
micurs

Seulement pour la documentation - j'ai eu cette erreur quand j'ai appelé accidentellement la mauvaise fonction (existante) avec des paramètres erronés. Il a fallu examiner la ligne erronée dans le fichier empaqueté .tmp/bla/bla/bla.ts pour voir l’erreur.

1
El Dude

Dans une réponse plus générique, l'erreur "Les paramètres fournis ne correspondent à aucune signature d'appel cible dans la méthode d'emballage - TypeScript" indique que vous appelez une fonction avec des paramètres incorrects. 

example () reçoit deux paramètres par définition, mais vous n'en transmettez qu'un:

example('param1') // wrong
example('param1','param2') // OK!
0
cepix

Dans mon cas, une astuce plus simple m'a permis d'esquiver l'erreur. L'appel (ou le déclencheur) d'une fonction est dû à ses parenthèses, donc:

class MyClass {
foo: any;

  firstMethod() {
     this.foo = this.secondMethod;
     this.foo();
  }

  secondMethod() {
  }
}
0
JaNe

Essayez de remplacer votre grosse flèche par une fonction normale. Cela va résoudre le problème.

0
Arun Giri