当我只有一个字段的接口时(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"
})