2014-09-02 5 views
15

OK Zgaduję, że brakuje mi czegoś naprawdę prostego na tym.Dostarczone parametry nie pasują do żadnego podpisu celu połączenia w metodzie opakowywania - Types

Powiedzmy mam wiele metod, które powtarzają wiele tych samych rzeczy tak:

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

ton z boilerplate dla pojedynczego wywołania this.unitOfWork.teamRepository.getDepartmentsForTeam(id)

więc chciałem zrobić rodzajowe otoki dla boilerplate takich jak:

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

którym mógłbym następnie wywołać jak:

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

Ale pojawia się następujący błąd:

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. 

Jaki jest właściwy sposób przekazać moją metodę w drugą nazwać to z parametrów dostarczanych?

Odpowiedz

3

musiałem zawijać wywołanie tak było owinięte w zamknięciu tak:

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

Jest to częsty błąd: nie można przekazać funkcję metody jako regularny funkcji, ponieważ wymaga instancję dla klasa jako kontekst. Rozwiązaniem jest użycie Zamknięcie:

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

Pełniejszy przykład można również zobaczyć moje snippet opublikowany tutaj: http://www.snip2code.com/Snippet/28601/Typescript--passing-a-class-member-funct

1

Tylko dla dokumentacji - Mam ten błąd, gdy przypadkowo nazywany złym (istniejące) z nieprawidłowymi parametrami. Musiał przyjrzeć się błędnej linii w opakowanym pliku .tmp/bla/bla/bla.ts, aby zobaczyć błąd.

0

Spróbuj wymienić strzałkę tłuszczu w normalnej funkcji. To rozwiąże problem. () => ng.IPromise do function() {.....} ng.IPromise

0

W moim przypadku prostszy trik pozwolił mi unik błąd. Wezwanie (lub wyzwalacza) funkcji jest ze względu na to nawiasach tak:

class MyClass { 
foo: any; 

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

    secondMethod() { 
    } 
} 
0

W odpowiedzi bardziej ogólny, parametry błędach „Dostarczany nie znaleziono żadnych podpis celu wywołania w metodzie otoki - Opis maszynowy " zwraca uwagę, że wywołujesz funkcję o nieprawidłowych parametrach.

przykład() przyjmuje dwa parametry z definicji, ale trzeba przejechać tylko jeden:

example('param1') // wrong 
example('param1','param2') // OK! 
Powiązane problemy