typescript - Hur man skickar variabla argument till basklass
Jag vill använda variabla argument i basklassens konstruktor. Samma sak i den härledda klassen. Konstruktorn kan ta emot ett okänt antal argument, och jag vill skicka dem till basklassens konstruktor för viss bearbetning. Jag har inte hittat någon bra lösning för det, och det verkar som att detta skulle kunna lösas med spread-operatören, som tydligen inte finns i TypeScript. Det kommer att utvecklas i version 1.5 (har jag rätt?):
class TSBase{
constructor(...args: any[]){
//do stuff with args
}
}
class TSSomeController extends TSBase{
constructor(...args: any[]){
//let base do some stuff
//super(...args); //this doesn't work, but it would be cool... :)
}
}
Vad är det bästa sättet att göra det på i TypeScript? Kan jag använda något som super.prototype.apply?
Svar #1
Som du har upptäckt är spridningsoperatören ännu inte tillgänglig.
REDIGERA - Sidnot: Faktiskt, det fungerar nu i TypeScript 1.5. Gör bara super(...args);
När det gäller det bästa sättet att göra detta före TypeScript 1.5... beror det verkligen på, men här är en lösning som inte innebär att några av de härledda klasserna ändras och håller sig till det du vill göra:
class TSBase {
constructor(...args: any[]) {
if (this.constructor != TSBase && args.length === 1 && args[0] instanceof Array) {
args = args[0];
}
// work with args here... for example:
args.forEach((val) => console.log(val));
}
}
class TSSomeController extends TSBase{
constructor(...args: any[]){
super(args);
}
}
new TSBase(3, 4); // 3, 4
new TSBase([3, 4]); // Array[2]
new TSSomeController(3, 4); // 3, 4
new TSSomeController([3, 4]); // Array[2]
new TSSomeController([3, 4], 5); // Array[2], 5
I princip kan du lägga till en kontroll i baskonstruktorn för att göra args-arrayen lika med det första elementet endast när den skickas in från en härledd klass, när det finns ett argument, och när det argumentet är en array.
Svar #2
I många fall hjälper en inherited-kontroll. Detta är ett av dem:
class TSBase {
constructor( ...args: any[] ) {
if ( this.constructor != TSBase ) args = args[0];
//do stuff with args
console.log(args);
}
}
class TSSomeController extends TSBase {
constructor( ...args: any[] ) {
super(args);
}
}
var base = new TSBase(1,2,3); // [1,2,3]
var child = new TSSomeController(1,2,3); // [1,2,3]
