TypeScript中如何通过泛型类型参数初始化对应类的实例
解决方案
首先明确核心限制:TypeScript 泛型属于编译期类型语法,运行时会被完全擦除,因此无法直接通过泛型参数 TTypeA/TTypeB 直接创建实例,必须将对应的类构造函数作为运行时参数传入。
具体实现逻辑如下:
- 定义构造函数类型约束:声明可接收
data参数、返回对应类型实例的构造器类型 - 改造
BaseService构造函数,新增两个构造器入参,用于在运行时创建实例 - 子类继承
BaseService时,在super调用中传入对应类的构造函数即可
完整可运行代码
export class MyClassA { // 可根据需要给data添加具体类型,此处用any做兼容 constructor(data: any) {} } export class MyClassB { constructor(data: any) {} } // 泛型TTypeA、TTypeB为实例类型 export class BaseService<TTypeA, TTypeB> { typeA: TTypeA; typeB: TTypeB; // 构造函数新增两个构造器参数: // typeACtor: 接收data参数,返回TTypeA实例的构造函数 // typeBCtor: 接收data参数,返回TTypeB实例的构造函数 constructor( typeACtor: new (data: any) => TTypeA, typeBCtor: new (data: any) => TTypeB, data: any ) { this.typeA = new typeACtor(data); this.typeB = new typeBCtor(data); } } export class DataService extends BaseService<MyClassA, MyClassB> { constructor(data: any) { // 调用父类构造时传入对应类的构造函数即可 super(MyClassA, MyClassB, data); } doSomething() { // 此处this.typeA会自动推导为MyClassA类型,有完整类型提示 console.log(this.typeA); console.log(this.typeB); } } const data: any = {}; const service = new DataService(data); service.doSomething();
扩展说明
如果你的构造函数参数格式固定,可以把构造器类型抽成公共类型简化代码:
// 通用构造器类型,支持任意参数 type Constructor<T> = new (...args: any[]) => T; // 限定参数必须为单个data的版本 type DataConstructor<T> = new (data: any) => T;
如果需要支持多个不同参数的构造函数,只需要调整Constructor类型的参数约束即可。
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

