如何仅从另一个类扩展类型声明,避免重复定义属性?
复用类属性类型声明而不继承方法的实现方案
针对你提出的问题,直接给出结论和具体实现方式:
- 可以在类B中复用类A的前77个属性类型声明
- 类B可以仅扩展类A的类型声明,无需继承任何方法
- 以下是两种最常用的避免重复定义属性的方案:
方案一:提取共享属性到接口(推荐)
把A和B共享的77个属性类型单独抽离成一个接口,让两个类分别实现这个接口。这种方式结构清晰,便于后续维护共享属性的类型。
// 定义共享属性接口,只包含类型声明 interface SharedProperties { p1: number; p2: string; // ... 省略p3到p76的声明 p77: "hello"; } class A implements SharedProperties { // 只需声明属性,类型自动匹配接口 public p1: number; public p2: string; // ... public p77: "hello"; constructor() { this.p1 = 5; // ... 类A的属性初始化逻辑 } } class B implements SharedProperties { // 复用接口的属性类型,无需重复定义 public p1: number; public p2: string; // ... public p77: "hello"; // 类B的独有属性 public p78: number; // ... 其他独有属性 constructor() { this.p1 = 879; // ... 类B的属性初始化逻辑 this.p78 = 8; } }
方案二:利用现有类A的实例类型复用
如果不想额外定义接口,可以直接提取类A的实例类型,让类B实现该类型并添加独有属性。这种方式适合无法修改现有类A结构的场景。
// 提取类A的实例类型,包含所有属性声明 type AInstanceProps = InstanceType<typeof A>; // 扩展A的实例类型,添加类B的独有属性 interface BInstanceProps extends AInstanceProps { p78: number; // ... 其他独有属性 } class B implements BInstanceProps { // 复用A的属性类型 public p1: number; public p2: string; // ... public p77: "hello"; // 类B的独有属性 public p78: number; // ... 其他独有属性 constructor() { this.p1 = 879; // ... 类B的属性初始化逻辑 this.p78 = 8; } }
关键说明
- 不要使用类继承(
class B extends A),因为继承会同时继承类A的构造函数和方法,不符合你“仅复用属性类型”的需求。 - 上述两种方案都能让TypeScript自动校验属性类型的一致性,避免手动重复编写77个属性的类型声明,同时保持两个类的方法完全独立。
内容的提问来源于stack exchange,提问作者user19024399
相关产品推荐
相关产品推荐

