Istanziare da questo in TypeScript?
Non sono sicuro che sia possibile, ma è quello che sto cercando di ottenere ...
abstract class Animal<T> {
breed(mate: Animal<T>) {
return new [this kind of animal]()
}
}
class Cat extends Animal<Cat>{
}
let cat1 = new Cat();
let cat2 = new Cat();
let kitten = cat1.breed(cat2);
È possibile questo tipo di cose o dovrei creare un breed
metodo per ogni tipo di animale?
In ES6 JS potresti usare new this.constructor()
ma in Typescript questo non è possibile:
abstract class Animal<T> {
breed(mate: Animal<T>) {
return new this.constructor()
}
}
darà un errore:
this expression is not constructable.
Type 'Function' has no construct signatures.
Risposte
(property) Object.constructor: Function
è Funzione , nel dattiloscritto non è possibile eseguire operazioni new
sopra di esso, inoltre this.constructor
non è riconosciuto come valore del tipo di costruttore da TypeScript
, ma è possibile eseguire il cast any
per ottenere la nuova istanza. Nel tuo caso qualcosa di simile a sotto -
abstract class Animal<T> {
breed(mate: Animal<T>) {
return new (<any>this.constructor);
}
}
In JavaScript ogni funzione è considerata come costruttore quando viene utilizzata con, new
quindi il codice JavaScript funziona correttamente senza problemi.