为什么Typescript不会为遗漏的参数引发错误?

时间:2019-11-08 16:59:41

标签: typescript

我有以下代码:

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行上抱怨呢?

游乐场链接:http://www.typescriptlang.org/play/?ssl=7&ssc=16&pln=1&pc=1#code/C4TwDgpgBAwghgGwQIzgYwNZQLxQBRwBcUAzsAE4CWAdgOYA0UyxZVdAlDgHxQBuA9pQAmAKBFp+1MlH7ISEcrwXF4SVJhxQAZgFdqaYJUkEWFGrXbEBwqAG8RUKBKn8EEAHQJ+tAuxEBfMVl5RQU8AHItfn5w9iA

1 个答案:

答案 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);

您的函数实际上是传入值,索引和数组的。但是您可以编写忽略后两个(甚至很少三个,尽管很少见)的代码。


简而言之:类型定义可强制您将某些值传递给。不能确保该函数确实使用这些值。