2016-09-30 3 views
1

Вкратце, я хочу создать класс, в котором хранится тип, который он будет создавать (вид фабричного объекта). Ниже приведен пример моей проблемы установки на набор классов образцов:В TypeScript я могу создать экземпляр из свойства, определенного как класс (не экземпляр), полученный из абстрактного класса?

abstract class Shape { 
    size: number; 
    abstract getArea(): number; 
} 

class Square extends Shape { 
    getArea(): number { return this.size * this.size; } 
} 

class ShapeGenerator { 
    shapeType: typeof Shape; 
    createShape(): Shape { return new this.shapeType() } // Here's the problem! 
} 

var squareGenerator = new ShapeGenerator(); 
squareGenerator.shapeType = Square; 

var mySquare = squareGenerator.createShape(); 
mySquare.size = 5; 
console.log(mySquare.getArea()); 

Я хочу shapeType представлять класс, который я буду создание экземпляра, но я хочу, чтобы ограничить это, чтобы быть чем-то производным от Shape. Конечно, я не могу создать новую форму, но я не могу понять, как написать, что shapeType будет , полученным от Shape, но на самом деле не будет be абстрактный класс формы.

Я не уверен, можно ли использовать охранник типа, чтобы объяснить, что это будет конкретный класс. Возможно, есть еще один способ, который я не рассматривал вообще. Мои текущие возможные решения - просто изменить тип возврата createShape на любой или потребовать функцию в качестве параметра конструктора, который заменил бы createShape.

ответ

2

Попробуйте

shapeType: { new(): Shape; }; 
+0

Ах, просто! Это просто гарантирует, что конструктор shapeType возвращает объект Shape, именно то, что мне нужно. Благодаря! –