如何从 TypeScript 中的对象的 class(es) 获取静态变量?

How do I get the static variables from the class(es) of an object in TypeScript?

我想访问创建对象的 classes 的静态成员,包括扩展构造函数的父 classes。

我目前的解决方法是将每个 class 添加到构造函数中的一个数组,但是,如果存在的话,我更喜欢一个更优雅的解决方案,因为我定义了数千个 classes , 或一种将类型限制为 master class.

的方法

下面是一些示例代码来说明我的意思。

type Class = { new(...args: any[]): any; }

class Animal {
 static description = "A natural being that is not a person"
 classes : Class[] = []
 constructor() {
   this.classes.push(Animal)
}
}

class Mammal extends Animal {
 static description = "has live births and milk"
 constructor() {
    super() // adds Animal to classes
    this.classes.push(Mammal)
 }
}

class Dog extends Mammal {
 static description = "A man's best friend"
 constructor() {
  super() //adds Animal and Mammal to classes
  this.classes.push(Dog)
}
}

class Cat extends Mammal {
 static description = "A furry purry companion"
 constructor() {
  super() //adds Animal and Mammal to classes
  this.classes.push(Cat)
}
}

let fido = new Dog()
fido.classes.forEach(function(i) {
   console.log(i.description)
}

我希望 classes 只接受 Animal 和 classes 扩展 Animal。

您可以在给定对象实例的情况下沿原型链向上走:

function describe(animal: Animal) {
    for (let prototype = Object.getPrototypeOf(animal); prototype !== Object.prototype; prototype = Object.getPrototypeOf(prototype))
        console.log(prototype.constructor.description);        
}

playground