TypeScript: No se puede usar 'new' con una expresión cuyo tipo carece de una firma de llamada o de construcción
Tengo una función que instancia un objeto con un constructor dado, pasando cualquier argumento.
function instantiate(ctor:Function):any {
switch (arguments.length) {
case 1:
return new ctor();
case 2:
return new ctor(arguments[1]);
case 3:
return new ctor(arguments[1], arguments[2]);
...
default:
throw new Error('"instantiate" called with too many arguments.');
}
}
Se utiliza así:
export class Thing {
constructor() { ... }
}
var thing = instantiate(Thing);
Esto funciona, pero el compilador se queja de cada instancia de new ctor, diciendo No se puede usar 'new' con una expresión cuyo tipo carece de una firma de llamada o de construcción.. ¿Qué tipo debería tener ctor?
Respuesta #1
Lo escribiría de esta manera (con genéricos como un extra):
function instantiate<T>(ctor: { new(...args: any[]): T }): T {
