You need to enable JavaScript to run this app. TypeScript中如何为存储抽象类派生类的数组定义正确类型
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何为存储抽象类派生类的数组定义正确类型

报错原因

你使用typeof AbstractClassToExtend作为数组类型会报错,是因为该类型代表抽象类本身的构造函数,TypeScript规则中抽象类不允许被直接实例化,即便数组中实际存储的都是可实例化的子类,TS也会按照抽象类的类型约束禁止实例化操作。

解决方案

推荐定义通用的可实例化构造函数类型,约束其返回的实例符合抽象类的结构即可,写法如下:

abstract class AbstractClassToExtend {
    constructor() { console.log("hello") }
}

class One extends AbstractClassToExtend {}
class Two extends AbstractClassToExtend {}

// 定义通用构造函数类型:无入参,返回AbstractClassToExtend实例
type AbstractConstructor = new () => AbstractClassToExtend;

// 数组定义为该构造函数类型的数组即可
const array: AbstractConstructor[] = [One, Two];

// 实例化不会再报错
new array[0]();

如果你的子类构造函数存在入参,可以调整构造函数类型的参数定义,比如适配任意入参的写法:

type AbstractConstructor = new (...args: any[]) => AbstractClassToExtend;

如果你的子类数量少且固定,也可以直接用子类类型的联合作为数组类型:

const array: (typeof One | typeof Two)[] = [One, Two];

这种写法的灵活性不如通用构造函数类型,新增子类时需要手动修改联合类型定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 16:06:05