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

dst*_*ley 8 javascript typescript

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

interface ComplicatedObject {
  propertyOne: string,
  propertyTwo: null
}

interface MoreComplicatedObject extends ComplicatedObject {
  propertyTwo: string
}
Run Code Online (Sandbox Code Playgroud)

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

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

art*_*tem 15

只有在扩展接口中的类型与属性的原始类型兼容时,您才能在扩展接口时覆盖属性类型。通常的情况是当您使用更严格的类型覆盖它时。

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

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

interface MoreComplicatedObject extends ComplicatedObject {
  propertyTwo: string
}
Run Code Online (Sandbox Code Playgroud)

或者您可以CompicatedObject按照此答案中的描述进行通用。

  • 这个答案对于OP来说是正确的,因为它覆盖了'null | string' 类型到 'string' 类型。但对于像我这样想要从“字符串”类型转换为“字符串|”的人来说,它不起作用。null' 类型,因为类型 'string | null' 不能分配给类型 'string',因为 'null' 不能分配给 'string'。 (4认同)