2015-08-03 1 views
5

Учитывая следующий класс:инстанцировании Общие типы

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

Quest ion: Невозможно создать экземпляр ограниченного типа T? Мое предположение заключалось в том, что, поскольку T ограничено, так что он должен расширять Datum, я мог бы сделать datum: T = new Datum().

ответ

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