扩展接口的属性而不声明新接口

时间:2017-10-27 19:07:09

标签: typescript

我正在使用TypeScript中的JSON API。除了附加字段外,JSON API的一部分通常是相同的。我正在尝试找到一个不包含仅为该属性创建额外命名接口的快捷方式。我经常要做以下事情:

interface ICar extends IVehicle {
  headlights: IHeadlights
}

interface IHeadlights extends ILights {
  beam_strength: number
}

在TypeScript中你可以做这样的事情但是你失去了扩展已经声明的接口的优势:

interface ICar extends IVehicle {
  headlights: {
      beam_strength: number,
      color: string,
      bulb: string
  }
}

理想情况下,我想将两者合并,所以我可以这样:

interface ICar extends IVehicle {
  headlights: ILights {
    beam_strength: number
  }
}

或类似的东西:

interface ICar extends IVehicle {
  headlights extends ILights {
    beam_strength: number
  }
}

有没有办法在TypeScript中做这样的事情?

2 个答案:

答案 0 :(得分:2)

假设IVehicleILights是现有类型,您可以使用intersection types创建ILights的新子类型,而不给它自己的名称:

interface ICar extends IVehicle {
  headlights: ILights & {
    beam_strength: number
  }
}

我真的不明白为什么你不想只是给它一个名字;扩展接口在编辑器中检查比交集类型更好,所以在其他条件相同的情况下,我更喜欢扩展接口。但这取决于你。

希望有所帮助;祝你好运!

答案 1 :(得分:1)

您可以尝试使用类型交集运算符&吗?这看起来像是:

interface ICar extends IVehicle {
    headlights: ILights & {
        beam_strength: number;
    }
}