Поставляемые параметры не соответствуют какой-либо сигнатуре цели вызова в методе обёртки - Typescript

Хорошо, я предполагаю, что я пропустил что-то действительно простое на этом.

Давайте скажем, что у меня есть несколько методов, которые повторяют много таких же вещей, как это:

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

Тонны шаблона для одного вызова this.unitOfWork.teamRepository.getDepartmentsForTeam(id)

поэтому я хотел создать общую оболочку для шаблона, например:

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

Что я мог бы тогда назвать:

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

Но я получаю следующую ошибку:

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.

Каков правильный способ передать мой метод в другой, чтобы вызвать его с предоставленными параметрами?

Ответы

Ответ 1

Мне нужно было обернуть вызов, чтобы он был завернут в закрытие:

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

Ответ 2

Это распространенная ошибка: вы не можете передавать функцию метода как регулярную функцию, так как она требует экземпляра для класса как контекста. Решение заключается в использовании замыкания:

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

Для более полного примера вы также можете увидеть мою snippet, опубликованную здесь: http://www.snip2code.com/Snippet/28601/Typescript--passing-a-class-member-funct

Ответ 3

Только для документации - я получил эту ошибку, когда случайно вызвал неправильную (существующую) функцию с неправильными параметрами. Если бы просмотреть ошибку в файле pack .tmp/bla/bla/bla.ts, чтобы увидеть ошибку.

Ответ 4

Попробуйте заменить жирную стрелку на нормальную функцию. Это решит проблему. () = > ng.IPromise в function() {ng.IPromise.....}

Ответ 5

В моем случае более простой трюк позволил мне уклониться от ошибки. Вызов (или триггер) функции обусловлен скобками, поэтому:

class MyClass {
foo: any;

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

  secondMethod() {
  }
}

Ответ 6

В более общем ответе ошибка "Поставляемые параметры не соответствуют какой-либо сигнатуре цели вызова в методе обертки - Typescript" указывает, что вы вызываете функцию с неправильными параметрами.

example() принимает два параметра для определения, но вы передаете только один:

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