泛型抽象类类型不兼容问题: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
相关产品推荐
相关产品推荐

