当有不同的参数计数时,有没有办法让Typescript认为函数类型是非等价的?

时间:2014-12-06 20:53:33

标签: function typescript

请考虑以下代码:

function typeTest(callback:(item1:number, item2:string)=>number):number {
    return callback(5, "foo");
}

//This works:
typeTest((num : number, str : string) => { return num;} )
//But surprisingly, so does this, even though the supplied callback doesn't have enough parameters
typeTest((num : number) => { return num;} )

我试图告诉编译器函数“typeTest”采用两个参数进行回调。但是,如果我给它一个参数较少的回调,它仍然有效。 我认为Typescript认为定义为“(num:number)=> number”的函数实现了“(number,item2)”的函数类型,基本上忽略了第二个参数。这有点道理,但我们重新定义了一个回调类型来获取更多参数,并期望编译器告诉我们忘记重新实现旧回调的地方。 我可能正在遇到Typescript类型系统的基本属性,但有没有办法告诉编译器,“不是真的 - 传入函数需要所有这些参数”?

编辑: 至于动机:在我们的例子中,我们曾经有一个“setSortFunction”方法,它期望一个方法接受一个项目并返回一个整数。如果您在所有项目中比较该整数,则可以对数组进行排序。后来我们把它改成接受更标准的,“拿两个项目,比较它们,然后返回-1,0或1”。所以,现在我们知道事实我们传入的sort函数需要带两个项目并进行比较。如果他们不这样做,他们可能会被打破。因此,我们想要一种方法来强制执行sortFunction传递的接受两个参数的要求。

1 个答案:

答案 0 :(得分:4)

  

但是,如果我给它一个参数较少的回调,它仍然有效。

是。这是设计的。想一想:调用者调用一个不关心最后几个参数的函数是安全的。这就是JS在传统代码库中的工作方式。

这将澄清一点:https://github.com/Microsoft/TypeScript/wiki/Type%20Compatibility#comparing-two-functions