实例化通用类型

Instantiating Generic Types

给出以下 class:

class Datum {}

当我尝试执行以下操作时收到错误消息 (error TS2304: Cannot find name 'T'):

class Data<T extends Datum> {
    datum: T

    constructor() {
        this.datum = new T()
    }
}

然后我尝试这样做,但我也收到一条错误消息 (Type 'Datum' is not assignable to type 'T'):

 class Data<T extends Datum> {
    datum: T

    constructor() {
        this.datum = new Datum();
    }
}

问题:是不是不能实例化约束类型T?我的假设是,由于 T 受到限制,因此它必须扩展 Datum,我能够做到 datum: T = new Datum().

要记住两件事:首先,泛型在编译过程中被清除。它们对运行时没有影响,因此任何将泛型类型当作运行时值来引用的尝试都是没有意义的。

其次,Datum 的派生 class 可能具有构造函数参数。即使 T 确实存在,你也不能盲目地 new 零参数。

综合起来,你想要的是:

class Datum {}

class Data<T extends Datum> {
    datum: T

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

class ByteDatum extends Datum {
    new() { }
}

let y = new Data(ByteDatum);
let x = y.datum; // x: ByteDatum