2014-09-02 96 views
15

好吧,我猜我错过了一件非常简单的事情。提供的参数与包装方法中调用目标的任何签名都不匹配 - 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. 

什么是通过我的方法到其他与提供的参数来调用它的正确方法?

回答

3

我需要换行调用,这样它被包裹在一个闭包像这样:

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

这是一个常见的错误:你不能传递的方法功能作为常规功能,因为它需要的实例类作为上下文。该解决方案是使用封闭:

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

1

仅适用于文档 - 我得到这个错误时,我不小心叫错(现有)函数具有错误的参数。必须查看打包文件.tmp/bla/bla/bla.ts中的错误行以查看错误。

0

尝试将您的胖箭头替换为正常功能。这将解决问题。 ()=> ng.IPromise 到 功能(){ng.IPromise .....}

0

在我来说,一个简单的伎俩让我躲闪的错误。呼叫(或触发)功能的是由于它括号,这样:

class MyClass { 
foo: any; 

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

    secondMethod() { 
    } 
} 
0

在一个更通用的答案,错误“提供的参数不包装方法匹配通话对象的任何签名 - Typescript“指出您正在调用具有错误参数的函数。

例如()接收每个定义的两个参数,但仅一个传递:

example('param1') // wrong 
example('param1','param2') // OK! 
相关问题