You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript ts2345报错:抽象构造函数无法赋值给非抽象构造函数如何解决

报错原因

你遇到的ts2345报错核心是类型不匹配:

  • 你把registers的类型定义为typeof FooAbstract[],而FooAbstract是抽象类,它的构造函数属于不可实例化的抽象构造类型
  • create方法要求传入的参数是new () => T类型,也就是可实例化的非抽象构造类型,二者不兼容自然会报错。
解决方法

核心是调整registers的类型定义,明确标注该数组里只存放继承自FooAbstract的可实例化子类构造函数。
修改后的完整代码如下:

// 先定义可实例化构造函数的通用类型
type NonAbstractConstructor<T = FooAbstract> = new () => T;

export abstract class FooAbstract {
    // 修改registers的类型为可实例化的子类构造数组
    static registers: NonAbstractConstructor[] = [];
    static create<T extends FooAbstract>(constr: NonAbstractConstructor<T>) {
        return new constr();
    }
}

export class A extends FooAbstract {
   name:string = 'demo';
}
// 注册子类不会报错
FooAbstract.registers.push(A);

// 批量实例化也不会再报错
const test = FooAbstract.registers.map((cls)=> FooAbstract.create(cls))
额外优化建议

如果你的子类构造函数可能带参数,也可以把构造函数类型调整为支持任意参数的版本:

type NonAbstractConstructor<T = FooAbstract, A extends any[] = any[]> = new (...args: A) => T;

内容的提问来源于stack exchange,提问作者jon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:15:04