我有以下代码:
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行上抱怨?
他们在文档中有一节讨论了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);
您的函数实际上是通过值,索引和数组传递的。但是您可以编写忽略最后两个(甚至很少三个,尽管很少见)的代码。
简而言之:类型定义是有强迫你一定值传递到的功能。不能确保该函数实际使用这些值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句