【问题标题】:Why is this lambda function not an error in typescript?为什么这个 lambda 函数不是打字稿中的错误?
【发布时间】:2017-01-16 09:32:37
【问题描述】:

我想象了这段代码

let x: (a: { b: number }) => void = (a: { b: number, c: string }) => { alert(a.c) };
x({ b: 123 });

应该会产生错误,因为 lambda 函数需要 a 参数上的附加属性,因此签名不应该兼容。但是在最新的打字稿游乐场尝试这个不会产生任何错误!这是为什么呢?

【问题讨论】:

  • 严格来说,就结构类型而言,实际函数确实匹配 x 的类型。

标签: javascript typescript types


【解决方案1】:

当你说

let x: (a: { b: number }) => void

您是说“x 是一个函数,它接受一个带有 b 键的对象。”

然后您为它分配了一个 lambda,该 lambda 接受一个带有 b 键和 c 键的对象。这会通过类型检查器,因为任何传入的对象都必须有一个 b 键。

然后你传递一个带有b 键的对象。没有错误。

如果您希望它因c 键而失败,请将x 的类型设为以下:

let x: (a: { b: number, c: string }) => void

【讨论】:

  • 很抱歉,但我仍然不明白为什么这不会是错误。需要一个 c 键的 lambda 不能只用一个 b 键传递一个对象,那么它为什么可以分配给 x 的类型,它接受呢?我的想法是参数类型是 lambda 可以假设的一组保证。将其分配给 x 会破坏这一点,因此不应允许。
  • 这是因为您为类型不太精确的变量提供了更精确的 lambda。想象一下,如果你说let x: Animal = new Cat()。这显然没问题,即使Animal 可能没有Cat 的所有属性。将需要更多属性的 lambda 分配给类型需要较少的变量也不是错误。
  • 当然,这对对象来说是完全有道理的,但对函数来说不应该是相反的方式吗?在对象中,你不能做let x: Cat = new Animal(),但你可以做相反的事情,因为这样无论 Cat 的具体情况如何,它都能做 Animal 能做的所有事情。在函数中,以动物为参数的函数f 可以接受猫,但以猫为参数的函数g 不能接受任何动物。换句话说,f 可以处理g 可以处理的所有输入,但反之则不行。因此,在我看来,f = g 应该是可以接受的,而不是g = f
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2012-10-14
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多