Как мне получить статические переменные из классов объекта в TypeScript?

typescript #class #inheritance #static

#typescript #класс #наследование #статические

Вопрос:

Я хотел бы получить доступ к статическим членам классов, из которых был создан объект, включая родительские классы, из которых был расширен конструктор.

Моя текущая работа заключается в добавлении каждого класса в массив в конструкторе, однако я бы предпочел более элегантное решение, если оно существует, поскольку я определяю тысячи классов, или способ ограничить тип мастер-классом.

Вот несколько примеров кода, чтобы показать, что я имею в виду.

 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)
}
 

Я бы предпочел, чтобы классы принимали только Animal и классы, расширяющие Animal.

Ответ №1:

Вы можете пройти цепочку прототипов, учитывая экземпляр объекта:

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

игровая площадка

Комментарии:

1. Красивые. Спасибо!