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

