2014-09-02 3 views
15

Ok, ich schätze, ich vermisse etwas wirklich Einfaches auf diesem.Mitgelieferte Parameter stimmen mit keiner Signatur des Aufrufziels in Wrapper-Methode überein - Typoskript

Lets sagen, dass ich mehrere Methoden, die eine Menge von den gleichen Dingen wie dies wiederholen:

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

Tonnen von vorformulierten für einen einzigen Aufruf this.unitOfWork.teamRepository.getDepartmentsForTeam(id)

so wollte ich für einen generischen Wrapper machen die vorformulierten wie:

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

Was ich dann wie nennen könnte:

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

Aber ich erhalte den folgenden Fehler:

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. 

Was ist der richtige Weg, um meine Methode in die andere zu übergeben Sie es mit dem mitgelieferten Parameter zu nennen?

Antwort

3

Ich brauchte den Anruf zu wickeln, so dass es wie so in einem Verschluss gewickelt wurde:

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

Dies ist ein häufiger Fehler: Sie können keine Methode Funktion als normale Funktion übergeben, da sie die Instanz für die erfordert Klasse als Kontext. Die Lösung ist ein Verschluss zu verwenden:

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

Für ein vollständigeres Beispiel können Sie auch meine sehen snippet hier veröffentlicht: http://www.snip2code.com/Snippet/28601/Typescript--passing-a-class-member-funct

1

nur für die Dokumentation - ich habe diesen Fehler, wenn ich versehentlich die falsche genannt (bestehende) funktionieren mit falschen Parametern. Musste in die fehlerhafte Zeile in der gepackten Datei .tmp/bla/bla/bla.ts schauen, um den Fehler zu sehen.

0

Versuchen Sie, Ihren fetten Pfeil in normale Funktion zu ersetzen. Dies wird das Problem beheben. () => ng.IPromise zu function() {ng.IPromise .....}

0

In meinem Fall ein einfacher Trick mir erlaubt, den Fehler ausweichen. Der Aufruf (oder Trigger) eine Funktion ist aufgrund seiner Klammern, so:

class MyClass { 
foo: any; 

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

    secondMethod() { 
    } 
} 
0

In einer allgemeineren Antwort, die Fehler „Mitgelieferte Parameter entsprechen keine Unterschrift von Rufziel in Wrappermethode - Typescript " weist darauf hin, dass Sie eine Funktion mit den falschen Parametern aufrufen.

example() erhält zwei Parameter per Definition, aber sie sind vorbei nur eins:

example('param1') // wrong 
example('param1','param2') // OK! 
Verwandte Themen