【发布时间】:2021-08-23 15:58:40
【问题描述】:
我有 2 个类似的设置,我希望它们产生相同的结果,但第二个会引发 Typescript 错误:
第一:
interface ISample {
requiredProp: string
optionalProp?: string
}
const sampleObj: ISample = { requiredProp: "hello" }
const { requiredProp, optionalProp = "default" } = sampleObj
console.log(requiredProp, optionalProp)
// Expected Output: "hello", "default"
// Actual Output: "hello", "default"
第二:
interface ISample {
requiredProp: string
optionalProp?: string
}
const sampleObj: ISample | {} = { requiredProp: "hello" } // object can now be empty
const { requiredProp = "default", optionalProp = "default" } = sampleObj
console.log(requiredProp, optionalProp)
// Expected Output: "hello", "default"
// Actual Output: Error: Property 'requiredProp' does not exist on type '{} | ISample'. Property 'optionalProp' does not exist on type '{} | ISample'.
是的,谢谢 Typescript,我知道这些道具可能不存在于那个空对象上这就是为什么我立即在同一行为它们分配默认值...
我需要使对象可选地为空,并且仍然能够从中解构未定义的值,因此我可以为它们分配默认值(如上面的示例中所示)或将它们与可选的链接运算符一起使用。如何在不输入任何对象的情况下摆脱这个无用的错误?
【问题讨论】:
-
为什么?如果
requiredProp不必存在于您的对象上,那么它并不是真正需要的。如果您不知道要在对象上使用什么道具,请使用Record。如果您知道它将来自一组属性,但希望允许省略任何字段,请使用Partial。否则,请始终提供所需的道具,不要将其键入为ISample | {}。 -
如果对象不为空,
requiredProp必须存在。该对象可以为空,因为应用程序可能仍处于获取状态并等待数据,但是当数据进入时,它必须与接口匹配。 -
null比{}更好用。可能在您的状态中包含布尔值hasLoaded。 -
我仍然想知道是否有任何解释,即使我提供了默认值,Typescript 也不允许我访问可选的联合对象属性。
-
因为
sampleObj的可能状态之一是{},其中requiredProp不可用。使用您拥有的联合,如果不声明类型,您将无法成功访问sampleObj的任何属性。
标签: typescript