在 TypeScript 中获取实例的 class

Get intance's class in TypeScript

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

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

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

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"

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

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

我也在尝试这个:

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

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

"T only refers to a type, but it is used as value here".

我知道函数是 class JavaScript(还有 TypeScript)中的第一个对象。但是 TypeScript classes 可能不是,然后可能就无法如我所愿了。

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

我能得到的最接近的是:

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"

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

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

您可以 return constructor 属性 您的 o

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

Demo