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

如何将推断类型分配给泛型,无需显式定义该类型?

如何自动推断泛型类型(无需显式定义)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:57:41