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美分。