如何从 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);
}
我想访问创建对象的 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);
}