Class TypeScript泛型类,用于创建其类型变量';什么课?

Class TypeScript泛型类,用于创建其类型变量';什么课?,class,typescript,generics,constructor,Class,Typescript,Generics,Constructor,我熟悉TypeScript中的泛型类,其中可以使用关联的类型变量定义类,然后具有特定类型的实例可以操作并返回该类型的值 问题:我需要一个泛型类来创建类型变量的实例。例如: class Thing { thingProp: string; } class ThingOne extends Thing { thingOneProp: string; } class ThingTwo extends Thing { thingTwoProp: string; } class Make

我熟悉TypeScript中的泛型类,其中可以使用关联的类型变量定义类,然后具有特定类型的实例可以操作并返回该类型的值

问题:我需要一个泛型类来创建类型变量的实例。例如:

class Thing {
  thingProp: string;
}

class ThingOne extends Thing {
  thingOneProp: string;
}

class ThingTwo extends Thing {
  thingTwoProp: string;
}

class Maker<T extends Thing> {

  make(): T {
    return new T();
    //         ^--- " // <- "error TS2304: Cannot find name 'T'""
  }

}

let thingOneMaker = new Maker<ThingOne>();

let thingOne: ThingOne = thingOneMaker.make();

let thingTwoMaker = new Maker<ThingTwo>();

let thingTwo: ThingTwo = thingTwoMaker.make();

let thingError: ThingOne = thingTwoMaker.make();
//      ^--- "error TS2322: Type 'ThingTwo' is not assignable to type 'ThingOne'"
而且,毫不奇怪,使用Node.js运行生成的JavaScript会产生
ReferenceError:T未定义
错误


如何创建一个泛型类,其实例可以创建类型变量类的实例?(使用TypeScript 2.0.10进行测试。)

不知何故,您需要为
Maker
类提供您希望它生成的类型的构造函数,以便它有一个可以调用
new
的值

我认为一个好的选择是将类构造函数作为参数传递给
Maker
的构造函数。这将允许它构造该类的实例,并且它将自动推断它正在构建的类型,这样您就不必再手动注释泛型类型了

所以可能是这样的:

class Maker<T extends Thing> {

  private ctor: {new(): T};

  constructor(ctor: {new(): T}) {
    this.ctor = ctor;
  }

  make(): T {
    return new this.ctor();
  }
}

孩子,这让我的生活更轻松了吗。谢谢。我尝试了此操作,但发现错误
类型为'typeof TutorialData'的参数不能分配给类型为'new()=>TutorialData'的参数。
class Maker<T extends Thing> {

  private ctor: {new(): T};

  constructor(ctor: {new(): T}) {
    this.ctor = ctor;
  }

  make(): T {
    return new this.ctor();
  }
}
let thingOneMaker = new Maker(ThingOne);
let thingOne: ThingOne = thingOneMaker.make();

let thingTwoMaker = new Maker(ThingTwo);
let thingTwo: ThingTwo = thingTwoMaker.make();

// Still an error.
let thingError: ThingOne = thingTwoMaker.make();