Ответ 1
Я бы написал это так (с дженериками в качестве бонуса):
function instantiate<T>(ctor: { new(...args: any[]): T }): T {
У меня есть функция, которая создает экземпляр объекта с заданным конструктором, передавая любые аргументы.
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.');
}
}
Он используется следующим образом:
export class Thing {
constructor() { ... }
}
var thing = instantiate(Thing);
Это работает, но компилятор жалуется на каждый экземпляр new ctor
, говоря Cannot use 'new' with an expression whose type lacks a call or construct signature.
. Какой тип должен иметь ctor
?
Я бы написал это так (с дженериками в качестве бонуса):
function instantiate<T>(ctor: { new(...args: any[]): T }): T {
Я также получил эту ошибку, когда мой тип был завернут в модуль, и я вызывал новый модуль, а не тип. Этот Q & A помог мне исключить некоторые вещи, а затем я пришел к пониманию, что это было довольно глупо после долгого дня программирования.