给定以下类别:

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的派生类可能具有构造函数参数。即使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

10-08 11:00