Поставляемые параметры не соответствуют какой-либо сигнатуре цели вызова в методе обёртки - 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!