Typescript:如何使用父级get方法获取子类实例

时间:2019-02-14 09:14:37

标签: typescript instance subclass

假设我有一个带有静态方法的父类,该方法返回一个实例,

abstract class AbstractManager {
    private static instance: AbstractManager;

    constructor() {
        AbstractManager.instance = this;
    }

    public static getInstance(): AbstractManager {
        return this.instance
    }

}

我有一个扩展父类的子类,

class Manager extends AbstractManager {
    constructor() {
        super();
    }
}

如果我调用Manager.getInstance(),则返回类型为父级AbstractManager

是否可以设置父getInstance()方法,使其返回子类型?

很明显,我可以向每个返回或强制转换为子类型的子类添加一个getInstance(),但是如果我有100个子类,则需要编写100次该方法。

尽管我对泛型的了解有限,但我尝试使用泛型的另一种解决方案是

public static getInstance<T extends AbstractManager>(): T {
    return this.instance;
}

但这已导致错误Type 'AbstractManager' is not assignable to type 'T'.

是否可以进行设置

Manager.getInstance() // is of type Manager not AbstractManager.

还是应该以其他方式解决此问题?谢谢。

1 个答案:

答案 0 :(得分:1)

您的getInstance方法是AbstractManager类的静态方法,它对实例化的类不执行任何操作。删除static

您也不需要instance成员。

abstract class AbstractManager {

    constructor() {
    }

    public getInstance(): this {
        return this
    }

}

class Manager extends AbstractManager {
    managerTalk() {
        console.log("Hello I am Manager");
    }
    constructor() {
        super();
    }
}

const manager = new Manager();

const instance = manager.getInstance();
console.log(manager.getInstance()) // <--Manager

manager.managerTalk();
instance.managerTalk();

Typescript Playground中查看

enter image description here