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

时间:2018-03-27 11:41:24

标签: typescript

我在TypeScript中使用交集类型时发现了一个问题...

我有三种类型别名:

  • Prototype<T> - 表示具有prototype属性的对象/类。
  • DefaultCtor<T> - 使用默认构造函数表示对象/类。
  • ParameterizedCtor<T>表示带参数化构造函数的对象/类。

我尝试过这些交集排列:

  • Prototype<T> & DefaultCtor<T> - 效果很好。
  • Prototype<T> & ParameterizedCtor<T> - 引发编译错误。

示例

type Prototype<T> = {
    prototype: T;
}

type DefaultCtor<T> = {
    new(): T;
}

type ParameterizedCtor<T> = {
    new(...args: any[]): T
}

function makeDefault<T>(ctor: Prototype<T> & DefaultCtor<T>): T {
    return new ctor();
}

function makeWithArgs<T>(ctor: Prototype<T> & ParameterizedCtor<T>, ...args: any[]): T {
    return new ctor(...args);
    // ERROR: Cannot use 'new' with an expression whose type lacks a call or construct signature.
}

Playground

中试用

错误 Prototype<T> & ParameterizedCtor<T>交叉点出现错误:

  

不能对类型缺少调用的表达式使用'new'   构建签名。

为什么TypeScript编译器将Prototype<T> & DefaultCtor<T>交集类型识别为具有构造函数,而不是Prototype<T> & ParameterizedCtor<T>交集类型?

2 个答案:

答案 0 :(得分:4)

这似乎是一个已知的错误,在Microsoft/TypeScript#17388提交,于2017年7月报告。它预定为TypeScript v2.9修复,但该问题的历史看起来像修复版本已经推了几次。去那儿,如果你觉得这么倾向,我想?希望有所帮助。祝你好运。

答案 1 :(得分:0)

解决方法

在某些边缘情况下,使用强制转换将提供临时解决方案,而TypeScript团队会提出修复。

示例

function make<T>(ctor: Prototype<T> & ParameterizedCtor<T>, ...args: any[]): T {
    console.log(ctor.prototype);
    return new (ctor as ParameterizedCtor<T>)(...args);
}