我为复杂的数据 struct 实现了构建器模式,其中一些值通过构建器创建:
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
是一个基类,所有其他构建器都将扩展,它允许为ParentBuilder
‘S产品的某些属性添加子构建器.
例如考虑产品:
interface CompanyAssets {
trucks: Truck[];
}
可能会有Truck
人的建造者:
class Truck {
color!: string;
}
class TruckBuilder implements Builder<Truck> {
build() {
return new Truck();
}
}
接下来,我创建了另一个扩展为ParentBuilder
的抽象类.这个类应该用一些额外的方法来增强ParentClass
.
abstract class CompanyAssetsBuilder<Product extends CompanyAssets> extends ParentBuilder<Product> {
setTruck() {
return this.setChild("trucks", () => {
return new TruckBuilder() as Builder<Element<Product["trucks"]>>;
});
}
}
到目前为止,一切都像预期的那样工作,但当我试图向TrackBuilder
添加方法或属性时,问题开始了.然后,TypeScrip认为TruckBuilder
不能与我觉得奇怪的Builder<Element<Product["trucks"]>>
相比较,因为具体的实现应该可以赋值给回调的返回值.
现在,我按照编译器错误消息的建议将返回值强制转换为unknown
,但我想知道为什么会发生这种情况.