Class 如何在运行时使用动态定义的类创建“新”对象?
我有一个插件类的列表,我想在运行时实例化,但是我得到的Class 如何在运行时使用动态定义的类创建“新”对象?,class,generics,dynamic,typescript,Class,Generics,Dynamic,Typescript,我有一个插件类的列表,我想在运行时实例化,但是我得到的不能将'new'与类型缺少调用或构造签名的表达式一起使用。错误 如果我为要扩展的对象声明一个基类,就会发生这种情况 class BaseAnimal { } class Dog extends BaseAnimal { say() { return "dog says woof"; } } class Cat extends BaseAnimal { say() { return "cat says miaow"; } }
不能将'new'与类型缺少调用或构造签名的表达式一起使用。
错误
如果我为要扩展的对象声明一个基类,就会发生这种情况
class BaseAnimal { }
class Dog extends BaseAnimal {
say() { return "dog says woof"; }
}
class Cat extends BaseAnimal {
say() { return "cat says miaow"; }
}
// declaring BaseAnimal as the base type breaks things
// var AnimalClasses:BaseAnimal[] = [Cat, Dog];
// this is OK tho using :any
var AnimalClasses:any[] = [Cat, Dog];
AnimalClasses.map( (Klass) => {
var animal = new Klass;
debug( Klass, "says", animal.say()) ;
})
给出:
[Function: Cat] +0ms says cat says miaow
[Function: Dog] +3ms says dog says woof
但它似乎不干净,只是使用:任何类型的这些。
这里有没有使用泛型的方法?使用
typeof BaseAnimal
:
class BaseAnimal {
say(): string { throw new Error("Not implemented."); }
}
class Dog extends BaseAnimal {
say() { return "dog says woof"; }
}
class Cat extends BaseAnimal {
say() { return "cat says miaow"; }
}
var AnimalClasses: typeof BaseAnimal[] = [Cat, Dog];
AnimalClasses.map((Klass) => {
var animal = new Klass;
debug(Klass, "says", animal.say());
});
因为您所指的是类型而不是实例。因此,当您在typescript中定义类时,您将介绍两件事:
Dog
用作类型注释时,如:
var dog: Dog;
typescript编译器将狗
识别为实例类型。但是,当您将其用作以下对象时:
var dog = Dog;
这里的Dog
被推断为构造函数,而不是类型
因此,您的
BaseAnimal
类型的animalclass
元素不能分配给Cat
或Dog
,因为它们都是构造函数。好奇的是,什么是typeofbaseanimal
——或者它不能以任何其他方式写入?@luqui尝试执行var baseAnimalType=BaseAnimal;var baseanimalistance=新的BaseAnimal()代码>。通过将鼠标悬停在变量名上,您将看到baseAnimalType
被键入为typeof BaseAnimal
,baseanimalistance
被键入为BaseAnimal
(),因此typeof
在运行时或编译时被typescript解析?它在编译时被解析。因为代码中的所有类型信息都可以静态确定。很好的解释,我想我明白了,谢谢!但是这里的另一个解决方案展示了一种真正做到这一点的方法。你认为这是最好的方法吗?当然。再加上我的2美分。