【问题标题】:TypeScript: Cannot use 'new' with an expression whose type lacks a call or construct signatureTypeScript:不能将“new”与类型缺少调用或构造签名的表达式一起使用
【发布时间】:2015-09-22 08:00:07
【问题描述】:

我有一个函数,它用给定的构造函数实例化一个对象,传递任何参数。

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应该有什么类型?

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

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

    【讨论】:

    • 我也是。你能提示一下有人可以在哪里找到一些关于的文档吗?
    【解决方案2】:

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

    【讨论】:

    • 是导出还是导出默认问题?
    • 我不再在这个代码库上工作,而且是很久以前的事了,我不记得了。对不起。我可以问你为什么要问吗?
    • 因为我遇到了类似的问题,并且它已修复,因为我试图使用导出的类,就好像它是默认导出一样,例如 import foo from "bar";但是 foo 是一个常规导出,所以我需要从“bar”导入 {foo},或者将导出更改为默认导出(这就是我所做的)
    • 这听起来对我的问题有点熟悉,除了我没有更改默认导出,我更改了导入端。
    猜你喜欢
    • 2018-02-06
    • 2017-03-25
    • 1970-01-01
    • 2021-01-04
    • 2017-01-29
    • 2018-02-09
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多