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
相关产品推荐
相关产品推荐

