You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅从另一个类扩展类型声明,避免重复定义属性?

复用类属性类型声明而不继承方法的实现方案

针对你提出的问题,直接给出结论和具体实现方式:

  1. 可以在类B中复用类A的前77个属性类型声明
  2. 类B可以仅扩展类A的类型声明,无需继承任何方法
  3. 以下是两种最常用的避免重复定义属性的方案:

方案一:提取共享属性到接口(推荐)

把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:15:34