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?
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
);
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
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.
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!
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() {
}
}
Essayez de remplacer votre grosse flèche par une fonction normale. Cela va résoudre le problème.