我注意到打字稿中的这种行为
interface Foo {
x: () => { x: 'hello' };
}
const a: Foo = {
x: () => {
return {
x: 'hello',
excess: 3, // no error
}
},
}
我在github中发现了一些问题,指出这是由于函数返回类型变宽所致。
函数返回类型扩展是什么意思?
答案 0 :(得分:2)
除非您直接将值分配给指定类型的引用,否则不会启动多余的属性检查。因此,除非您直接将对象文字分配给参数或变量或返回显式键入的内容,否则不会收到错误。
在这种情况下,x
函数是在确定外部对象文字的类型的过程中独立键入的,其返回类型被确定为{ x: 'hello', excess: 3 }
。然后,检查此功能与x
中的Foo
的兼容性,并发现它是兼容的。没有检查对象文字直接分配给显式输入的引用。因此,不会触发多余的财产检查。
您在问题中发现的范围扩大并不会导致IMO出现错误。编译器使用上下文类型来确定某些类型。因此,例如,它将使用以下事实:将外部对象文字分配给Foo
引用作为上下文,这将有助于例如确定参数类型,并且将停止{ x: "hello" }
的扩展到{ x: string }
,但不会触发多余的属性检查。
并不是说这是它应该工作的方式,而且我已经看到很多围绕这个确切问题的问题,即从理论上确定了返回类型的函数中重新调整对象文字时,缺少多余的属性检查通过上下文声明。