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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:45:05