将抽象类构造函数作为函数参数传递

时间:2019-01-18 16:52:10

标签: typescript

我试图将对Abstract Class Constructor的引用作为函数参数传递。一切都适用于任何抽象类,但我无法将引用传递给抽象类构造函数,任何人都知道该怎么做?

abstract class AbstractPerson
{
}

function add<T>(provider: new(...rest) => T): void
{
}

add(AbstractPerson);

3 个答案:

答案 0 :(得分:2)

您不应尝试使用new实例化一个抽象类,因此它正确地与new(...rest: any[])=>any签名不匹配。只要您不实例化抽象构造函数,就可以尝试引用其prototype属性,因为它仍然具有该属性:

abstract class AbstractPerson {
}

function add<T>(provider: { prototype: T }): void {
}

add(AbstractPerson); // works now
// T inferred as AbstractPerson

希望有所帮助;祝你好运!

答案 1 :(得分:0)

您不能实例化一个抽象类。我会这样:

abstract class AbstractPerson
{
}

function add<T extends AbstractPerson>(provider: new(...rest) => T): void
{
}

class Person extends AbstractPerson { }

add(Person);

答案 2 :(得分:0)

我遇到了类似的问题,我需要传递一个抽象类,然后在列表中进行搜索以查找所有条目,这些条目是扩展该基类的类的实例。我修改了Jcalz的答案,以允许我在函数中使用instanceof:

abstract class AbstractObject {
}

function findMatch<T>(provider: { prototype: T } & Function): T {
    let match: T;
    for (const element of object_list){
        if (element instanceof provider){
            match = element;
        }
    }
    // ... do some null check here
    return match;
}

// match is inferred to be type 'AbstractObject'
const match = findMatch(AbstractObject);