TypeScript: Невозможно использовать "новый" с выражением, чей тип не имеет вызова или построения подписи

У меня есть функция, которая создает экземпляр объекта с заданным конструктором, передавая любые аргументы.

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?

Ответ 1

Я бы написал это так (с дженериками в качестве бонуса):

function instantiate<T>(ctor: { new(...args: any[]): T }): T {

Ответ 2

Я также получил эту ошибку, когда мой тип был завернут в модуль, и я вызывал новый модуль, а не тип. Этот Q & A помог мне исключить некоторые вещи, а затем я пришел к пониманию, что это было довольно глупо после долгого дня программирования.