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

如何设计满足同色系类型返回规则的TypeScript类体系?

解决方案:基于泛型基类的共享逻辑复用

要满足你的需求,核心是通过泛型基类提取鲸类和海洋类的共享方法实现,同时通过泛型参数绑定对应颜色的类类型,确保方法返回正确的实例。以下是具体实现:

1. 泛型基类定义

首先创建两个抽象泛型基类,分别处理鲸类和海洋类的共享逻辑:

// 鲸类泛型基类:提取所有鲸类的共享方法
abstract class WhaleBase<Self extends WhaleBase<Self, Ocean>, Ocean extends OceanBase<Ocean, Self>> {
  // 返回同颜色鲸类实例的共享方法
  swim(): Self {
    return new (this.constructor as new () => Self)();
  }

  // 返回同颜色海洋类实例的共享方法
  dive(): Ocean {
    return new (this.oceanConstructor as new () => Ocean)();
  }

  // 子类必须指定对应颜色的海洋类构造函数
  protected abstract oceanConstructor: new () => Ocean;
}

// 海洋类泛型基类:提取所有海洋类的共享方法
abstract class OceanBase<Self extends OceanBase<Self, Whale>, Whale extends WhaleBase<Whale, Self>> {
  // 返回同颜色海洋类实例的共享方法
  wave(): Self {
    return new (this.constructor as new () => Self)();
  }

  // 返回同颜色鲸类实例的共享方法
  spawnWhale(): Whale {
    return new (this.whaleConstructor as new () => Whale)();
  }

  // 子类必须指定对应颜色的鲸类构造函数
  protected abstract whaleConstructor: new () => Whale;
}

2. 具体颜色类实现

基于泛型基类,实现四个具体的颜色类,只需绑定对应颜色的构造函数,还可添加类独有的方法:

// 蓝鲸类
class BlueWhale extends WhaleBase<BlueWhale, BlueOcean> {
  protected oceanConstructor = BlueOcean;

  // 蓝鲸独有的方法
  singLoudly(): void {
    console.log("蓝鲸发出洪亮的叫声!");
  }
}

// 蓝海洋类
class BlueOcean extends OceanBase<BlueOcean, BlueWhale> {
  protected whaleConstructor = BlueWhale;

  // 蓝海洋独有的方法
  coolCurrent(): void {
    console.log("蓝海洋中有凉爽的洋流!");
  }
}

// 橙鲸类
class OrangeWhale extends WhaleBase<OrangeWhale, OrangeOcean> {
  protected oceanConstructor = OrangeOcean;

  // 橙鲸独有的方法
  splashBrightly(): void {
    console.log("橙鲸欢快地溅起水花!");
  }
}

// 橙海洋类
class OrangeOcean extends OceanBase<OrangeOcean, OrangeWhale> {
  protected whaleConstructor = OrangeWhale;

  // 橙海洋独有的方法
  warmShallows(): void {
    console.log("橙海洋中有温暖的浅滩!");
  }
}

3. 子类扩展验证

验证子类扩展时,基类方法始终返回原核心类实例:

// 扩展蓝鲸子类
class SuperBlueWhale extends BlueWhale {
  // 子类独有的方法
  superSwim(): void {
    console.log("超级蓝鲸游得飞快!");
  }
}

const superBlueWhale = new SuperBlueWhale();
// swim() 返回 BlueWhale 实例,而非 SuperBlueWhale
const blueWhale = superBlueWhale.swim();
console.log(blueWhale instanceof BlueWhale); // true
console.log(blueWhale instanceof SuperBlueWhale); // false

// dive() 返回 BlueOcean 实例
const blueOcean = superBlueWhale.dive();
console.log(blueOcean instanceof BlueOcean); // true

方案优势

  • 代码复用:所有共享方法仅实现一次,避免重复逻辑
  • 类型安全:泛型参数确保返回类型与调用者颜色严格匹配,TypeScript会自动校验
  • 扩展性强:子类可自由添加独有的方法,且基类方法不受影响,始终返回原核心类实例
  • 可维护性:修改共享方法逻辑时,只需更新泛型基类即可

内容的提问来源于stack exchange,提问作者Farwheel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:30:47