【问题标题】:Get intance's class in TypeScript在 TypeScript 中获取实例的类
【发布时间】:2018-07-04 08:55:56
【问题描述】:

如何在 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;
}

但它给出了一个comiple错误:

“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"

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

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

【问题讨论】:

    标签: typescript class-method


    【解决方案1】:

    您可以返回oconstructor 属性

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

    Demo

    【讨论】:

    • 太棒了!我怎么知道我可以通过构造函数对象访问静态方法?构造函数对象不是类,应该在类上调用静态方法。这是非常反直觉的!这是否记录在某处?
    • 构造函数只返回用于创建该对象的函数。 Class是TS/JS中的一个函数,可以实例化一个对象。类只是创建对象的面向对象的方式。
    • 哦,好的,谢谢。其实我知道在普通的 Js 中,一个类只是一个函数,但随着时间的推移我忘记了。 :-)
    猜你喜欢
    • 2017-04-22
    • 2021-03-20
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2016-10-05
    • 2017-01-10
    • 2019-06-10
    • 2018-06-24
    相关资源
    最近更新 更多