实例化泛型类型



给定以下类:

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

最新更新