Я использую машинопись и хочу написать фабричную функцию для создания нового экземпляра объекта и предоставления массива свойств для заполнения. В основном преобразователь из существующего объекта в новый экземпляр другого (связанного) типа. Он должен использоваться следующим образом:
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>({ ... });
и хочу использовать некоторая форма generi 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({ ... });
Я бы предположил, что это теоретически возможно, так как во время компиляции контекст функции stati c известен, и вы мог бы вывести тип класса, но я не выяснил, как использовать этот унаследованный тип в определении сигнатуры.
Это хороший (приемлемый) шаблон, и если нет, то что мне делать?
Любая помощь приветствуется!