polimorfismo herencia clases constructor typescript abstract-class

constructor - herencia - polimorfismo en typescript



Tipo de constructor abstracto en TypeScript (3)

El punto principal con las clases abstractas (en OO en general) es que no se pueden crear instancias, se necesita una implementación concreta no abstracta.

Supongo que desea tener diferentes implementaciones para esa clase abstracta y desea poder recibir una de esas implementaciones (como un parámetro o algo parecido).
Si ese es el caso, entonces tal vez esto podría resolver su problema:

declare type ConstructorFunction<T extends Utilities> = new (...args: any[]) => T; abstract class Utilities { } class MyUtilities extends Utilities { } var UtilityClass: ConstructorFunction<MyUtilities> = MyUtilities;

La firma de tipo para una clase no abstracta (función de constructor no abstracta) en TypeScript es la siguiente:

declare type ConstructorFunction = new (...args: any[]) => any;

Esto también se conoce como un tipo que se puede mantener . Sin embargo, necesito una firma de tipo para una clase abstracta (función de construcción abstracta). Entiendo que se puede definir como que tiene el tipo Function , pero eso es demasiado amplio. ¿No hay una alternativa más precisa?

Editar:

Para aclarar lo que quiero decir, el siguiente fragmento pequeño muestra la diferencia entre un constructor abstracto y un constructor no abstracto:

declare type ConstructorFunction = new (...args: any[]) => any; abstract class Utilities { ... } var UtilityClass: ConstructorFunction = Utilities; // Error.

El tipo ''Utilidades de tipo'' no se puede asignar al tipo ''nuevo (... args: cualquiera []) => cualquiera''.

No se puede asignar un tipo de constructor abstracto a un tipo de constructor no abstracto.


Teniendo el mismo problema. Supongo que la esencia de la firma abstracta de un constructor de clases es una ausencia de new ( ... ) : X thingy en su declaración. Es por eso que puede ser declarado explícitamente.

Sin embargo. Puedes hacer esto, y se compilará.

var UtilityClass: typeof Utilities = Utilities;

typeof Something es una buena forma de hacer referencia a los tipos de constructores, sin embargo, no se puede extender.

Y en cualquier caso puedes hacer algo así:

var UtilityClass: ConstructorFunction = <any> Utilities;


Yo solo estaba luchando con un problema similar, y esto parece funcionar para mí:

type Constructor<T> = Function & { prototype: T }