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

interface ValObj  {
  val: number
}

使用另一个字段创建对象会产生错误。
const someObj: ValObj = {
  val: 5,
  someStr:"hello"
}

但当我们从函数返回值时,这个原则并不一致。定义一个函数来返回同一个接口,并返回同一个对象。
const func: () => ValObj =
  () => ({
    val: 5,
    someStr: "sdf"
  })

Demo
为什么typescript的类型检查允许这样做?有办法吗?

最佳答案

您在第一个示例中看到的错误是过度属性检查的结果。只有当对象文本直接分配给给定类型的某个对象时,才会检查过量的属性。
在这种情况下:

const func: () => ValObj =
  () => ({
    val: 5,
    someStr: "sdf"
  })

输入的方法是首先确定箭头函数的类型,即() => { val: number, someStr: string },然后检查它是否与给定的函数签名() => ValObj兼容,因为{ val: number, someStr: string }ValObj的一个子类型。没有直接指定给ValObj的对象文本。
如果对arrow函数的返回类型是显式的,则会得到一个错误:
const func: () => ValObj =
  () : ValObj => ({
    val: 5,
    someStr: "sdf"
  })

10-04 15:23