为什么 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
他们在文档中有一节讨论了这个 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);
你的函数实际上会传入一个值、一个索引和数组。但是你可以编写忽略后两个(或者甚至三个,虽然那很少见)的代码。
简而言之:类型定义的存在是为了强制你将某些值传入函数。它的存在不是为了确保函数实际上会使用这些值。
