为什么将分配给对象文字的变量作为实参(let x = {color: 'red', width: 200}
)与传递对象文字的实参({color: 'red', width: 200}
)之间有区别?
换句话说,参数的值是相同的({color: 'red', width: 200}
)。
那么,为什么编译器在传递对象时进行多余的检查,而在传递给该对象的变量通过时进行“常规形状”检查呢?
考虑一下函数类型签名:
type SOME_OBJECT = {
propA: TYPE_A,
propB: TYPE_B
}
function foo(obj: SOME_OBJECT) {
// WILL DO SOMETHING WITH obj
}
在上面的示例中,函数foo
期望一个对象obj
具有a propA
typeTYPE_A
和a propB
type TYPE_B
。只要某些东西满足了这些要求,功能foo
就可以完成它的事情。至少,这就是其合同所隐含的含义。那么多余的属性应该检查obj
什么呢?
现在让我们分配一个对象文字。假设您有一个带有可选参数 的类型maybe
。
interface SOME_OBJECT_WITH_OPTIONAL {
color: string,
width: number,
maybe?: boolean
}
const x1: SOME_OBJECT_WITH_OPTIONAL = {
color: "red",
width: 200,
mayeb: true // <--- TS ERROR HERE - EXCESS PROPERTY CHECKING IS REALLY IMPORTANT
}
看到您已经将该maybe
属性拼写为mayeb
。多亏了多余的属性检查,Typescript警告您您犯了该错误。如果不按原样处理,您能想象疼痛吗?在我们的示例中,没有属性会丢失,因为它maybe
是可选的,因此允许其丢失。您将不会收到任何错误或警告。
仍然期望obj
类型为a的函数SOME_OBJECT_WITH_OBJECT
不介意。因为所有的所要求的特性color
和width
存在。
您可以在此处阅读有关此主题的更多信息:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句