我有以下代码:
type Callback = (a: string, b: string) => void
const observer: Callback = function(a: string): void {
console.log(a)
}
observer('foo')
Typescript在最后一行抱怨:
Expected 2 arguments, but got 1.(2554)
为什么TS只在观察者调用上抱怨,而不是在实现观察者的第3行上抱怨呢?
答案 0 :(得分:3)
他们在文档中有一节专门讨论了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);
您的函数实际上是传入值,索引和数组的。但是您可以编写忽略后两个(甚至很少三个,尽管很少见)的代码。
简而言之:类型定义可强制您将某些值传递给。不能确保该函数确实使用这些值。