TypeScript中如何获取实例所属类及父类静态变量并做类型约束?
优化实现方案
核心思路
- 收紧类型定义,将
classes数组成员限制为仅允许Animal及其子类的构造函数 - 在基类
Animal的构造函数中自动遍历实例的原型链,收集所有继承层级的类构造函数,无需每个子类手动编写插入逻辑
完整实现代码
// 定义严格的Animal类构造函数类型,约束必须符合Animal及其子类的结构 type AnimalConstructor = { new (...args: any[]): Animal; description: string; } class Animal { static description = "A natural being that is not a person" classes: AnimalConstructor[] = [] constructor() { let currentProto = Object.getPrototypeOf(this); const classCollect: AnimalConstructor[] = []; // 遍历原型链直到根对象Object,收集所有层级的构造函数 while (currentProto && currentProto.constructor !== Object) { classCollect.push(currentProto.constructor as AnimalConstructor); currentProto = Object.getPrototypeOf(currentProto); } // 反转顺序保证和原实现一致:父类在前,子类在后 this.classes = classCollect.reverse(); } } // 子类无需任何额外的classes处理逻辑,正常继承即可 class Mammal extends Animal { static description = "has live births and milk" } class Dog extends Mammal { static description = "A man's best friend" } class Cat extends Mammal { static description = "A furry purry companion" } // 测试效果和原实现完全一致 let fido = new Dog() fido.classes.forEach(function(i) { console.log(i.description) })
方案优势
- 零侵入子类代码:后续新增上千个子类也不需要编写任何和
classes相关的逻辑,只要正常继承Animal即可,大幅降低维护成本 - 类型安全:
classes数组的类型被严格限制,无法存入非Animal体系的构造函数,符合类型约束需求 - 逻辑统一:所有
classes的收集逻辑都收敛在基类中,出现问题只需要修改基类一处即可
内容的提问来源于stack exchange,提问作者Joseph C. Caswell
相关产品推荐
相关产品推荐

