Внедрение зависимостей абстрактного класса в машинопись - PullRequest
0 голосов
/ 09 декабря 2018

Я новичок в машинописи и пытаюсь использовать внедрение зависимостей для создания объектов пользовательского интерфейса, которые расширяют базовый абстрактный класс UIObject, но у меня возникает ошибка «Невозможно создать экземпляр абстрактного класса»

Вот упрощенный пример:

abstract class UIObject {
// Some methods
}

class Cursor extends UIObject {
// Some other methods
}

function create (UIObjectClass: typeof UIObject){
  return new UIObjectClass()
}

Я хочу, чтобы функция create могла принимать любой класс, расширяющий UIObject, в качестве параметра и создавать экземпляр этого класса.Однако, поскольку UIObject является абстрактным классом, это не работает, так как вы не можете создать экземпляр абстрактного класса.

Какой лучший способ сделать это?

1 Ответ

0 голосов
/ 10 декабря 2018

Во-первых, вы должны убедиться, что create принимает класс, а не экземпляр.

interface Constructable {
  new (...args: any[]): any;
}

function create<T extends Constructable>(UIObjectClass: T): InstanceType<T> {
  return new UIObjectClass();
}

Это заставит TypeScript принимать только конкретные классы.

create(UIObject);     // Error! Can't use an abstract class here.
create(Cursor);       // OK
create(new Cursor()); // Error! We should be passing a class, not an instance.

У меня естьНе удалось найти аргумент - UIObjectClass - наследуется от UIObject.

...