gpt4 book ai didi

typescript - 在 TypeScript 中获取实例的类

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:33 25 4
gpt4 key购买 nike

如何在 TypeScript 中获取实例的类?这个问题类似于Get an object's class name at runtime in TypeScript但我不想得到类名。我想自己上课。

我需要这个做什么? TypeScript 没有类方法,只有静态方法。但它们不是虚拟的。为了将我的心智模型完全转化为Js代码,我需要有虚类方法。

我的想法是做这样的事情:

function classOf<T>(o: T) : any {
return o.class; // How to write this???
}

class Foo {
static tryMe() : string {
return "foo";
}

}

class Bar extends Foo {
static tryMe() : string {
return "bar";
}

}

function testPolymorphClassMethod(instance : Foo) {
console.log(classOf(instance).tryMe());
}

testPolymorphClassMethod(new Foo()); // Should print "foo"
testPolymorphClassMethod(new Bar()); // Should print "bar"

只要有具体类可用,我就可以直接调用它的静态方法。如果只有一个实例可用,我想调用其类的静态方法,例如手动将其虚拟化。

问题是我不知道如何编写 classOf 函数。这可能根本不可能。

我也在尝试这个:

function classOf<T>(o: T) : typeof T {
return typeof o;
}

但它给出了一个复杂的错误:

“T只是指一个类型,但它在这里被用作值”。

我知道函数是 JavaScript(以及 TypeScript)中的一流对象。但 TypeScript 类可能不是,然后可能无法做我想做的事。

是否有不需要为每个后代类键入大量代码的解决方法?

我能得到的最接近的是:

class Virtualizer {
virtual(methodName: string) : any {
return eval(this.constructor.name+"."+methodName);
}
}

class Foo extends Virtualizer {
static getMyName() : string {
return "foo";
}

public test() : string {
return this.virtual("getMyName")();
}

}

class Bar extends Foo {
static getMyName() : string {
return "bar";
}
}

let foo = new Foo();
let bar = new Bar();

console.log(foo.test()); // Prints "foo"
console.log(bar.test()); // Prints "bar"

但这会丢失所有类型信息,它需要一个公共(public)基类(或代码重复),而且我永远无法调用我想调用的实际方法,只是一个“虚拟器”。太笨拙了。

我可以将类相关信息提取到封装的单例对象中,但这需要我将许多方法的可见性从 protected 更改为公共(public)。 (而且还会在主对象和封装对象之间产生大量的交叉引用,也很笨拙。)

最佳答案

您可以返回 oconstructor 属性

function classOf<T>(o: T): any {
return o.constructor;
}

参见 Demo

关于typescript - 在 TypeScript 中获取实例的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48437284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com