【问题标题】:Extend property of interface without declaring a new interface扩展接口属性而不声明新接口
【发布时间】:2017-10-28 03:12:40
【问题描述】:

我正在使用 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 中做这样的事情?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    假设IVehicleILights 是现有类型,您可以使用intersection types 创建ILights 的新子类型,而无需为其命名:

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

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

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

    【讨论】:

    • 谢谢!在对大型 JSON API 进行建模时,命名变得困难并且似乎会增加很多混乱和代码行。我们使用 JSON API 规范 jsonapi.org 通常模型 99% 相同,但包含一个隐藏的附加属性。使用扩展,我们需要创建一堆命名接口来添加一个属性。也许还有一些非常不同的更好的方法。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多