2015-08-03 13 views
5

Data la seguente classe:Tipi instantiating generici

class Datum {} 

ricevo un messaggio di errore (error TS2304: Cannot find name 'T') quando provo a fare quanto segue:

class Data<T extends Datum> { 
    datum: T 

    constructor() { 
     this.datum = new T() 
    } 
} 

Allora provo a fare questo, ma io anche un messaggio di errore (Type 'Datum' is not assignable to type 'T'):

class Data<T extends Datum> { 
    datum: T 

    constructor() { 
     this.datum = new Datum(); 
    } 
} 

Quest ione: Non è possibile istanziare il tipo vincolato T? La mia ipotesi era che poiché T è vincolato in modo tale che deve estendere Datum, sarei in grado di fare datum: T = new Datum().

risposta

6

Due cose da ricordare: in primo luogo, i farmaci generici vengono cancellati durante la compilazione. Non hanno alcun impatto sul runtime, quindi qualsiasi tentativo di fare riferimento a un tipo generico come se fosse un valore di runtime non ha significato.

In secondo luogo, è possibile che una classe derivata di Datum disponga di parametri del costruttore. Anche se esistesse lo T, non è possibile ciecamente new con zero argomenti.

Mettendo che, insieme, ciò che si vuole è questo:

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