实例化泛型类型

6

给定以下类:

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

1个回答

6

需要记住两件事:首先,在编译期间,泛型被擦除。它们没有运行时的影响,因此任何试图将泛型类型引用为运行时值的尝试都没有意义。

其次,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接