TypeScript 如何让两个已存在的接口对等兼容以互相共享属性?
解决方案
你遇到的循环继承报错是因为两个接口双向引用导致的,只要打破循环即可,不需要新增交叉类型每次手动转,两种可选方案:
方案1:接口合并+单向补充(最符合你现有结构)
因为A是第三方自带的接口,TS本身支持同名接口自动合并,你只需要单向给A扩展B的方法,再给B补全A的方法即可,不需要互相继承:
// 给第三方A接口扩展B的所有方法,不会触发循环 interface A extends B {} // 你自己的B接口正常声明,补全A的已有方法即可 interface B { FB(): void; FA(): void; }
处理完之后,a实例天然有FB的类型提示,b实例也天然有FA的类型提示,不需要任何额外类型转换。如果B的方法很多,这个方案也只需要你给A写一次extends就行。
方案2:直接改写实例类型(适合不想改动接口定义的场景)
如果你不想修改原有接口的定义,直接修改两个实例的类型声明即可:
// 直接声明实例同时包含两个接口的所有成员,不需要额外定义C类型 declare const a: A & B; declare const b: B & A;
如果a是第三方库导出的实例,用模块扩充改写它的类型即可:
// 把xxx-lib替换成第三方库的实际包名 declare module 'xxx-lib' { export const a: import('你的B接口所在模块').B & A; }
类实现适配
你自己写的B类需要调用this.FA(),上面两种方案都已经给B接口补充了FA的类型声明,调用时不会触发类型报错,完全适配你的现有实现。
你已经完成了运行时的原型修改,以上方案仅处理类型检查逻辑,不会影响实际运行效果。
内容的提问来源于stack exchange,提问作者pilaoda
相关产品推荐
相关产品推荐

