如何扩展接口并覆盖属性的类型?

新手上路,请多包涵

我有一个非常复杂的对象,它有多个属性,我想扩展和覆盖一个特定的属性。

 interface ComplicatedObject {
  propertyOne: string,
  propertyTwo: null
}

interface MoreComplicatedObject extends ComplicatedObject {
  propertyTwo: string
}

本质上,类型为 ComplicatedObject MoreComplicatedTypepropertyTwo 。我想避免在 propertyTwo 上使用联合类型,因为所有使用 propertyTwo 的调用都假定它是一个字符串,而不是空值,所以我宁愿不必包含类型检查我访问的每个实例 propertyTwo

如何扩展接口并覆盖现有属性的类型?

原文由 dstaley 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 632
2 个回答

仅当扩展接口中的类型与属性的原始类型兼容时,才可以在扩展接口时覆盖属性类型。通常的情况是当你用更严格的类型覆盖它时。

这意味着您必须有先见之明,并使用与所有可能的扩展兼容的类型声明原始属性。在您的情况下,您可以在 ComplicatedObject 中使用联合类型:

 interface ComplicatedObject {
  propertyOne: string,
  propertyTwo: null | string
}

interface MoreComplicatedObject extends ComplicatedObject {
  propertyTwo: string
}

或者您可以使 CompicatedObject 通用,如 本答案 中所述。

原文由 artem 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 Omit<T, K> ,它允许您省略某个类型的某些键。然后,您可以使用 & 附加所需的密钥。

 type A = {a: string, b: string}
type B = Omit<A, 'b'> & {b: number}

请注意,您可以将 A 声明为接口, Omit<T,K> 类似地工作。

游乐场链接

原文由 David Min 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题