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. Красивые. Спасибо!