Istanziare da questo in TypeScript?

Aug 19 2020

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 breedmetodo 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

MBB Aug 19 2020 at 20:46

(property) Object.constructor: Functionè Funzione , nel dattiloscritto non è possibile eseguire operazioni newsopra di esso, inoltre this.constructornon è riconosciuto come valore del tipo di costruttore da TypeScript, ma è possibile eseguire il cast anyper 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, newquindi il codice JavaScript funziona correttamente senza problemi.