2017-01-23 2 views
2

Я пытаюсь реализовать стандартный абстрактный шаблон фабрики в Typcript, но компилятор не работает. Вот упрощенная версия моего кода:Как создать абстрактный заводской шаблон в TypScript?

abstract class Model { } 
class User extends Model { } 

abstract class ModelFactory<T extends typeof Model> { 
    constructor(private modelConstructor: T) {} 

    public create(): T { 
    return new (this.modelConstructor)(); // ERROR HERE 
    } 
} 
class UserFactory extends ModelFactory<typeof User> { 
    constructor() { 
    super(User); 
    } 
} 

let user: User; 
user = new UserFactory().create(); 

Однако, когда я компилирую с помощью TSC 2.1, я получаю следующее сообщение об ошибке в строке указана выше:

model.ts(8,13): error TS2511: Cannot create an instance of the abstract class 'Model'. 

Если удалить типобезопасность и конвертировать строка 0:

return new (this.modelConstructor as any)(); 

Код компилируется без ошибок. Однако это печально. Есть ли способ сделать этот код компилируемым без использования броска? И если нет, то почему?

ответ

4

Вы должны использовать этот шаблон вместо:

abstract class ModelFactory<T extends Model> { 
    constructor(private modelConstructor: new() => T) { } 

    public create(): T { 
     return new (this.modelConstructor)(); // OK! 
    } 
} 

class UserFactory extends ModelFactory<User> { 
    constructor() { 
     super(User); 
    } 
} 
+0

Ницца! Не знал об этом синтаксисе. –