我正在使用打字稿并想编写一个工厂函数来创建一个新的对象实例并提供一个要填充的属性数组。基本上是从现有对象到另一种(相关)类型的新实例的转换器。应该这样使用
const newA = A.from({ a: 1 });
const newC = C.from({ a: 1, b: 2, c: 9 });
我有这个工作(为清楚起见省略了成员变量,Object.create 可能更简单,原因见下文)
class A {
static from(data: Partial<A>) : A {
const o = Object.create(A);
Object.assign(o, data);
return o;
}
}
只要我从这个类继承,它就可以很好地工作。我不想像这样随时重新创建此功能
class A {
static from(data: Partial<A>) : A {
const o = Object.create(A);
Object.assign(o, data);
return o;
}
}
class B extends A {
static from(data: Partial<B>) : B {
const o = Object.create(B);
Object.assign(o, data);
return o;
}
}
以下代码段有效,但我需要在调用两次时指定类
class A {
...
static from<T extends A>(data: Partial<T>) : T {
const o = Object.create(this);
Object.assign(o, data);
return o;
}
}
const newC = C.from<C>({ ... });
并想使用某种形式的通用,即我想象这样的事情。
class A {
static from<T extends this>(data: Partial<T>) : A {
const o = Object.create(this);
Object.assign(o, data);
return o;
}
}
const new C = C.from({ ... });
我猜这在理论上是可能的,因为在编译时静态函数的上下文是已知的,您可以推断类类型,但我没有弄清楚如何在签名定义中使用这个继承的类型。
这是一个好的(可接受的)模式吗?如果不是,我该怎么办?
任何帮助表示赞赏!