什么类型的函数返回类型扩大

时间:2019-03-04 06:13:23

标签: typescript

我注意到打字稿中的这种行为

interface Foo {
  x: () => { x: 'hello' };
}

const a: Foo = {
  x: () => {
    return {
      x: 'hello',
      excess: 3, // no error
    }
  },
}

我在github中发现了一些问题,指出这是由于函数返回类型变宽所致。

函数返回类型扩展是什么意思?

1 个答案:

答案 0 :(得分:2)

除非您直接将值分配给指定类型的引用,否则不会启动多余的属性检查。因此,除非您直接将对象文字分配给参数或变量或返回显式键入的内容,否则不会收到错误。

在这种情况下,x函数是在确定外部对象文字的类型的过程中独立键入的,其返回类型被确定为{ x: 'hello', excess: 3 }。然后,检查此功能与x中的Foo的兼容性,并发现它是兼容的。没有检查对象文字直接分配给显式输入的引用。因此,不会触发多余的财产检查。

您在问题中发现的范围扩大并不会导致IMO出现错误。编译器使用上下文类型来确定某些类型。因此,例如,它将使用以下事实:将外部对象文字分配给Foo引用作为上下文,这将有助于例如确定参数类型,并且将停止{ x: "hello" }的扩展到{ x: string },但不会触发多余的属性检查。

并不是说这是它应该工作的方式,而且我已经看到很多围绕这个确切问题的问题,即从理论上确定了返回类型的函数中重新调整对象文字时,缺少多余的属性检查通过上下文声明。

相关问题