【发布时间】:2022-01-27 07:35:42
【问题描述】:
我有几个工厂类做同样的事情:
export class XFactory {
private readonly validator: XValidator;
private readonly transformer: XTransformer;
private constructor( private readonly data: any, connection: Connection) {
this.validator = new XValidator(connection);
this.transformer = new XTransformer();
}
public static async build(data: any, connection: Connection) {
const factory = new XFactory (connection);
await factory.validate();
const dto = await factory.transform();
const x = new X(dto, connection);
return x;
}
private async validate(): Promise<void | never> {
await this.validator.validate(this.data);
}
private async transform(): Promise<XDto> {
return await this.transformer.transform(this.data);
}
}
过程总是一样的:
- 验证数据,如果无效则抛出错误
- 将数据转换为构造函数使用的有效 DTO
- 实例化对象并返回它
我在创建此类的抽象时遇到问题:
我已经尝试过这样的父工厂,但我有两个问题,用星号标记:
export class Factory<T,U> {
private constructor(
private readonly data: any,
private readonly validator: Validator,
private readonly transformer: Transformer<U>
) {}
protected static
public static async build(data: any, validator: Validator, transformer: Transformer<U>*1, connection: Connection) {
const factory = new Factory (data, validator, transformer);
await factory.validate();
const dto: U*1 = await factory.transform();
const x: T*1 = new T*2(...[dto, connection]);
return x;
}
private async validate(): Promise<void|never> {
await this.validator.validate(this.data);
}
private async transform(): Promise<XDto> {
return await this.transformer.transform(this.data);
}
}
*1 静态成员不能引用类类型参数:这是一个小问题,但我很想知道一个解决方法。 *2 找不到名称“T”:有没有办法实例化这个类?我知道 typescript 无法将其翻译成 js,我只是想写一些东西来表达我的意图。
构造函数方法也是私有的,因为我不想将验证和转换与构造函数分开,但它们具有异步性质。
¿是否有另一种方法可以解决这个问题,或者我可以修改我的代码以便重构那些 XFactory 类?
【问题讨论】:
标签: typescript oop typescript-generics