TypeScript如何定义继承基类的类类型(而非实例类型)
解决方案
你需要定义LetterClass为可实例化、返回Letter实例的构造函数类型,无需手动枚举所有子类联合,写法如下:
abstract class Letter {} class A extends Letter {} class B extends Letter {} class C extends Letter {} // 核心类型定义 type LetterClass = new () => Letter // 正常使用无报错 const exampleUsage: LetterClass[] = [A, B, C] const sample = exampleUsage[0] new sample() // 类型正常,无报错
如果你的子类构造函数需要携带参数,可以调整类型兼容任意入参:
// 支持任意入参的构造函数版本 type LetterClass = new (...args: any[]) => Letter
如果需要更灵活的泛型版本,也可以这么写:
type LetterClass<T extends Letter = Letter> = new (...args: any[]) => T
原写法报错原因
你之前用typeof Letter获取的是抽象基类本身的构造类型,TypeScript 会标记抽象类的构造函数不可直接实例化,因此调用new的时候会抛出错误。而我们自定义的构造函数类型,只约束「实例化后返回Letter子类实例」这一规则,所有继承Letter的非抽象子类都天然符合这个类型约束,新增子类也无需手动修改类型定义,完全满足你的需求。
内容的提问来源于stack exchange,提问作者ajthinking
相关产品推荐
相关产品推荐

