他们的文档中有一个部分讨论这个https://www.typescriptlang.org/docs/handbook/type-compatibility.html#comparing-two-functions
基本上,这是因为在 javascript 中,忽略额外的函数参数是合法的并且有些普遍。例如,下面的代码声称它需要一个b 参数,但从不使用它:
const observer: Callback = function(a: string, b: string): void {
console.log(a);
}
大概你同意这应该匹配Callback 类型定义。但是b: string 在参数列表中的作用是什么?它的唯一作用是更改observer.length 的值,并更改observer.toString() 返回的内容。实际上,在大多数情况下,这只是浪费打字。
在现实世界中,数组有几个高阶函数,例如.map、.filter、.reduce。您将一个函数传递给它来控制行为是什么。您的函数将传入多条数据,但在许多情况下您只需要一条。因此,不应将以下内容标记为类型错误:
const numbers = [1, 2, 3];
const biggerNumbers = numbers.map(value => value + 1);
您的函数实际上是传入一个值、一个索引和数组。但是您可以编写忽略最后两个(甚至全部 3 个,尽管这种情况很少见)的代码。
简而言之:类型定义会强制您将某些值传递给函数。它不能确保函数确实使用这些值。