2013-07-04 128 views
1

复制标识当试图编译:打字稿:在功能型

function foo(f: (number, number)=>boolean) {} 

我得到的错误:

Duplicate identifier 'number'. 

为什么?我打算陈述的是f是一个函数,它带有两个参数,每个参数类型为number,并返回boolean。我如何说明这一点?

仅供参考,下面就编译:

function foo2(f: (number) => boolean) { } 

function foo3(f: (a: number, b: number) => boolean) { } 

function foo4(f: (number, string) => boolean) { } 

但下面不(它产生完全相同的错误,Duplicate identifier 'number'):

function foo5(f: (number, number[]) => boolean) { } 

回答

3

你必须命名参数的函数f接收。所以这就是为什么foo3有效。 foo2foo4编译是因为编译器将这些作为名称,并且因为没有类型,因此假定为any类型。他们可以改写为:

function foo2(f: (number: any) => boolean) { } 
function foo4(f: (number: any, string: any) => boolean) { } 

当然这是一些令人困惑的代码。

考虑到这一点foo不起作用,因为编译器会认为这意味着:

function foo(f: (number: any, number: any)=>boolean) {} 

,并是你有一个重复的标识number

+0

马恩,我必须命名的论点?有没有办法解决这个问题?显然,变量名称不是逻辑*必需的。 (即,它们在编译时被完全擦除)。 – jameshfisher

+0

没有办法绕过它。在光明的一面,它向任何使用你的代码的人提供了一个很好的暗示。 –