如何设计满足同色系类型返回规则的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
相关产品推荐
相关产品推荐

