typescript - Skapa instanser av generiska typer
Givet följande klass:
class Datum {}
Jag får ett felmeddelande (error TS2304: Cannot find name 'T') när jag försöker göra följande:
class Data<T extends Datum> {
datum: T
constructor() {
this.datum = new T()
}
}
Så då försöker jag göra detta, men jag får också ett felmeddelande (Type 'Datum' är inte tilldelningsbar till typ 'T'):
class Data<T extends Datum> {
datum: T
constructor() {
this.datum = new Datum();
}
}
Fråga: Är det inte möjligt att instansiera den begränsade typen T? Min antagelse var att eftersom T är begränsad så att den måste utvidga Datum, skulle jag kunna göra datum: T=new Datum().
Svar #1
Två saker att komma ihåg: För det första raderas generiska typer under kompilering. De har ingen effekt vid körning, så varje försök att referera till en generisk typ som om det vore ett värde vid körning är meningslöst.
För det andra är det möjligt för en härledd klass av Datum att ha konstruktörsparametrar. Även om T fanns, kan du inte bara blint new den med noll argument.
Sätter man ihop det här, är det du vill ha detta:
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
