Typescript: Как получить экземпляр подкласса, используя родительский метод get - PullRequest
0 голосов
/ 14 февраля 2019

Предположим, у меня есть родительский класс со статическим методом, который возвращает экземпляр,

abstract class AbstractManager {
    private static instance: AbstractManager;

    constructor() {
        AbstractManager.instance = this;
    }

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

}

И у меня есть дочерний класс, который расширяет родительский класс,

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

Если яinvoke 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 голосов
/ 14 февраля 2019

Ваш 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

...