Estoy tratando de proporcionar un tipo de retorno dinámico para un método heredado al pasar la clase secundaria al padre. Encuentre un pequeño ejemplo a continuación. Actualmente no está funcionando y estoy pensando que no estoy muy lejos.
Soy consciente de que una solución es declarar manualmente que cada método heredado en cada clase secundaria es una opción, y simplemente llamar a super() desde adentro, pero esa no es una solución tan elegante como esperaba.
Espero que alguien pueda ayudarme a descubrir los tipos genéricos o si es posible.
Gracias por adelantado:
/** * The Animal base class * @class */ class Animal { /** * @param {T} classType */ constructor (classType) { this.classType = classType } /** * @returns {T} A baby of the same type as the parent instance */ giveBirth () { return new this.classType() } } /** * The Dog class * @class * @extends Animal */ class Dog extends Animal { constructor () { super(Dog) } bark () { return 'woof' } } const dog = new Dog() const babyDog = dog.giveBirth() babyDog.bark() // JSDoc does not consider it an instance of DogAgregar @template para Animal y la extensión correcta ( @extends Animal<Dog> ) funciona para mí
/** * The Animal base class * @class * @template T */ class Animal { /** * @param {T} classType */ constructor (classType) { this.classType = classType } /** * @returns {T} A baby of the same type as the parent instance */ giveBirth () { return new this.classType() } } /** * The Dog class * @class * @extends Animal<Dog> */ class Dog extends Animal { constructor () { super(Dog) } bark () { return 'woof' } } const dog = new Dog() const babyDog = dog.giveBirth() babyDog.bark()