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

泛型抽象类类型不兼容问题:Builder模式扩展报错解析

Builder模式实现中的TypeScript类型兼容性问题

我为复杂数据结构实现了Builder模式,部分值通过构建器创建,核心代码如下:

export interface Builder<Product> {
  build(): Product;
}

export type Element<T> = T extends Array<infer Y> ? Y : T;
export type BuilderInit<Product, Key extends keyof Product> = (
  product: Product,
) => Builder<Element<Product[Key]>>;

abstract class ParentBuilder<Product extends object> {
  readonly #childrenMap = new Map<
    keyof Product,
    BuilderInit<Product, keyof Product>[]
  >();

  protected setChild<Key extends keyof Product>(
    key: Key,
    cb: BuilderInit<Product, Key>,
  ) {
    this.#childrenMap.set(key, [cb]);

    return this;
  }
}

ParentBuilder是所有其他构建器的基类,允许为产品的某些属性添加子构建器。

举个例子,定义如下产品结构:

interface CompanyAssets {
  trucks: Truck[];
}

对应的Truck类和其构建器:

class Truck {
  color!: string;
}

class TruckBuilder implements Builder<Truck> {
  build() {
    return new Truck();
  }
}

接着我创建了继承自ParentBuilder的抽象类来增强功能:

abstract class CompanyAssetsBuilder<Product extends CompanyAssets> extends ParentBuilder<Product> {
  setTruck() {
    return this.setChild("trucks", () => {
      return new TruckBuilder() as Builder<Element<Product["trucks"]>>;
    });
  }
}

目前这段代码能正常运行,但当我尝试给TruckBuilder添加额外的方法或属性时,TypeScript会提示TruckBuilder与Builder<Element<Product["trucks"]>>类型不兼容。我对此感到困惑,因为具体的实现类应该可以赋值给回调的返回值类型。现在我按照编译器提示把返回值转成了unknown,但想知道这个问题出现的根本原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:25:12