在定义返回接口的函数时,Typescript似乎行为不一致

Ben*_*arp 2 typescript

当我有一个只有一个字段的接口(val)

interface ValObj  {
  val: number
}
Run Code Online (Sandbox Code Playgroud)

使用另一个字段创建对象会产生错误.

const someObj: ValObj = {
  val: 5, 
  someStr:"hello"
}
Run Code Online (Sandbox Code Playgroud)

但是当我们从函数返回一个值时,这个原则并不一致.定义一个函数来返回相同的接口,并返回相同的对象.

const func: () => ValObj = 
  () => ({
    val: 5, 
    someStr: "sdf"
  })
Run Code Online (Sandbox Code Playgroud)

演示

为什么Typescript的类型检查允许这个?它有什么办法吗?

Tit*_*mir 5

您在第一个示例中看到的错误是超额财产检查的结果.仅当将对象文字直接分配给给定类型的某些内容时,才会检查多余的属性.

在这种情况下:

const func: () => ValObj = 
  () => ({
    val: 5, 
    someStr: "sdf"
  })
Run Code Online (Sandbox Code Playgroud)

完成输入的方法是首先找出箭头函数的类型,() => { val: number, someStr: string }然后检查它是否与给定的函数签名兼容,() => ValObj因为它{ val: number, someStr: string }是一个子类型ValObj.没有任何地方直接分配对象文字ValObj.

如果您明确指出箭头函数的返回类型,则会出现错误:

const func: () => ValObj = 
  () : ValObj => ({
    val: 5, 
    someStr: "sdf"
  })
Run Code Online (Sandbox Code Playgroud)