Я создал фабрику, которая будет создавать экземпляры определенных классов. Я хочу использовать дженерики, чтобы гарантировать, что все возвращаемые объекты принадлежат подклассам, которые расширяют абстрактные классы.
Я подумал, что логику метода createInstance
, показанного ниже, можно описать как «createInstance () вернет тип T
, который ограничен как класс, расширяющий Animal.
Как видите, Lion расширяет Animal, но я все равно получаю предупреждение компилятора type Lion is not assignable to type T
.
abstract class Animal {
abstract makeSound(): void;
}
class Bear extends Animal {
public makeSound() {
console.log('growl');
}
}
class Lion extends Animal {
public makeSound() {
console.log('roar');
}
}
function createInstance<T extends Animal>(type: string): T {
switch(type) {
case 'bear':
return new Bear(); // 'type Bear is not assignable to type T'
case 'lion':
return new Lion(); // 'type Lion is not assignable to type T'
}
}
createInstance().makeSound();
Я прочитал в конце документов TypeScript Generics, которые:
При создании фабрик в TypeScript с использованием универсальных шаблонов необходимо ссылаться на типы классов с помощью их функций-конструкторов. Например,
function create<T>(c: {new(): T; }): T { return new c(); }
но я действительно не хочу передавать конструктор класса в функцию, если это возможно, и хотел бы понять, почему я вообще получаю сообщение not assignable to type T
.
Спасибо