如何将推断类型分配给泛型,无需显式定义该类型?
如何自动推断泛型类型(无需显式定义)
TypeScript中类的泛型参数在声明阶段就需要确定,无法从实例方法的赋值语句反向推断。要实现自动推断泛型类型,可通过以下几种方式调整代码结构:
方案1:构造函数传入Form实例,自动推断泛型
调整父类构造逻辑,让子类通过构造函数参数的类型自动推断父类泛型:
import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; abstract class A<T> { form: T; protected constructor(form: T) { this.form = form; } } // 子类无需显式指定泛型,TS会从构造函数参数自动推断 class A1 extends A<ReturnType<typeof A1.prototype.createForm>> { constructor(private fb: FormBuilder) { super(fb.group({ id: 2 })); } // 封装Form创建逻辑,帮助TS准确推断类型 private createForm() { return this.fb.group({ id: 2 }); } } const fb = new FormBuilder(); const a1 = new A1(fb); a1.form.value.code; // 抛出错误:类型“Partial<{ id: number | null; }>”上不存在属性“code”,符合预期
方案2:用工厂函数生成子类,利用函数泛型推断
通过工厂函数封装子类创建逻辑,让泛型从Form的创建表达式自动推断:
import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; abstract class A<T> { form!: T; } // 工厂函数:接收FormBuilder和创建Form的回调,返回对应子类实例 function createFormComponent<T extends FormGroup<any>>( fb: FormBuilder, createForm: (fb: FormBuilder) => T ): A<T> { class ConcreteComponent extends A<T> { constructor() { super(); this.form = createForm(fb); } } return new ConcreteComponent(); } // 使用示例 const fb = new FormBuilder(); const a1 = createFormComponent(fb, (fb) => fb.group({ id: 2 })); a1.form.value.code; // 抛出错误,符合预期
方案3:子类继承时用typeof表达式推断类型
如果坚持在实例方法中赋值,可通过typeof表达式获取Form类型,避免手动定义额外类型:
import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; abstract class A<T> { form!: T; } class A1 extends A<typeof A1.prototype.form> { constructor(private fb: FormBuilder) { super(); } setForm(): void { // 用类型断言关联类的泛型类型 this.form = this.fb.group({ id: 2 }) as typeof this.form; this.form.value.code; // 抛出错误,符合预期 } } const fb = new FormBuilder(); const a1 = new A1(fb); a1.setForm();
内容的提问来源于stack exchange,提问作者La Poirçsse
相关产品推荐
相关产品推荐

