TypeScript:不能对类型缺少调用或构造签名的表达式使用“new”

时间:2015-07-04 19:25:01

标签: 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应该包含哪种类型?

2 个答案:

答案 0 :(得分:19)

我会这样写(以泛型作为奖励):

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

答案 1 :(得分:0)

当我的类型被包装在一个模块中时,我也遇到了这个错误,我在模块上调用new而不是类型。这个Q&amp; A帮助我排除了一些事情,然后我意识到经过漫长的一天编程之后,这是非常愚蠢的事情。