繁体   English   中英

TypeScript泛型类,它创建类型变量类的实例?

[英]TypeScript generic class that creates instances of its type variable's class?

我熟悉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'"

这几乎似乎有效。 编译器生成代码,最后一行的错误表明TypeScript了解thingTwoMaker.make()应返回的类型。

但是, return new T();出错return new T(); 表明TypeScript不理解我正在尝试创建类型变量的类的实例,并且生成的JavaScript确认它:

var Maker = (function () {
    function Maker() {
    }
    Maker.prototype.make = function () {
        return new T(); // <- "error TS2304: Cannot find name 'T'"
    };
    return Maker;
}());

并且,毫不奇怪,使用Node.js运行生成的JavaScript会产生ReferenceError: T is not defined错误。

如何创建一个泛型类,其实例可以创建类型变量类的实例? (使用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();
  }
}

然后,您可以将正确的类构造函数传递给每种Maker ,并自动推断类型:

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();

游乐场链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM