Skip to content

扩展类型

有一些类型可能是其他类型的更具体的版本,这是很常见的。例如,我们可能有一个 BasicAddress 类型,描述发送信件和包裹所需的字段。

typeScript
interface BasicAddress { 
  name?: string; 
  street: string; 
  city: string; 
  country: string; 
  postalCode: string; 
}

在某些情况下,这就足够了,但是如果一个地址的小区内有多个单元,那么地址往往有一个单元号与之相关。我们就可以描述一个 AddressWithUnit :

typeScript
interface AddressWithUnit { 
  name?: string; 
  unit: string; 
  street: string; 
  city: string; 
  country: string; 
  postalCode: string; 
}

这就完成了工作,但这里的缺点是,当我们的变化是纯粹的加法时,我们不得不重复 BasicAddress 的所有其他字段。相反,我们可以扩展原始的 BasicAddress 类型,只需添加 AddressWithUnit 特有的新字段:

typeScript
interface BasicAddress { 
  name?: string; 
  street: string; 
  city: string; 
  country: string; 
  postalCode: string; 
} 

interface AddressWithUnit extends BasicAddress { 
  unit: string; 
}

接口上的 extends 关键字,允许我们有效地从其他命名的类型中复制成员,并添加我们想要的任何新成员。这对于减少我们不得不写的类型声明模板,以及表明同一属性的几个不同声明可能是相关的意图来说,是非常有用的。

例如,AddressWithUnit 不需要重复 street 属性,而且因为 street 源于 BasicAddress ,我们会知道这两种类型在某种程度上是相关的。

接口也可以从多个类型中扩展。

typeScript
interface Colorful { 
  color: string; 
}

interface Circle { 
  radius: number;
}

interface ColorfulCircle extends Colorful, Circle {} 

const cc: ColorfulCircle = { 
  color: "red", 
  radius: 42, 
};