实例化通用类型

时间:2015-08-03 17:30:17

标签: generics typescript instantiation

鉴于以下课程:

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 个答案:

答案 0 :(得分: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