【问题标题】:Why is Typescript not raising an error for missed arguments?为什么 Typescript 不会为遗漏的参数引发错误?
【发布时间】:2019-11-09 02:04:29
【问题描述】:

我有以下代码:

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

【问题讨论】:

    标签: typescript


    【解决方案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);
    

    您的函数实际上是传入一个值、一个索引和数组。但是您可以编写忽略最后两个(甚至全部 3 个,尽管这种情况很少见)的代码。


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

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 2015-08-05
      • 2021-04-21
      • 2021-12-07
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多