Есть ли способ избавиться от перегрузки метода, когда вы хотите «разложить» массив входящих аргументов?
Например, у вас есть класс, который содержит конфигурацию свойства:
class PropertyConstructor<T> {
type: T;
}
class PropertyConfiguration<T, S extends keyof any> {
constructor(
public propertyKey: S,
public propertyConstructor: new () => PropertyConstructor<T>,
) {}
}
Далее создайте несколько наследников конструкторов:
class StringPropertyConstructor extends PropertyConstructor<string> {
}
class NumberPropertyConstructor extends PropertyConstructor<number> {
}
Затем создайте функцию, которая создаст класс с конфигами свойства:
type Join<T, S extends keyof any> = {[P in S]: T};
function CreateClass<T1, S1 extends keyof any>(p1: PropertyConfiguration<T1, S1>): new () => Join<T1, S1>;
function CreateClass<T1, S1 extends keyof any, T2, S2 extends keyof any>(
p1: PropertyConfiguration<T1, S1>,
p2: PropertyConfiguration<T2, S2>,
): new () => Join<T1, S1> & Join<T2, S2>;
// ... And so on. It's very uncomfortable and ugly.
function CreateClass(...properties: Array<PropertyConfiguration<any, keyof any>>): new () => any {
class NewClass {}
// Here was the logic of executing property constructors
return NewClass;
}
И создайте несколько экземпляров PropertyConfiguration:
const property1 = new PropertyConfiguration('property1', StringPropertyConstructor);
const property2 = new PropertyConfiguration('property2', NumberPropertyConstructor);
Funnaly, попробуем применить это:
class A extends CreateClass(property1, property2) {
}
const a = new A();
a.property1 // string;
a.property2 // number;
Это работает!Но очень неудобно и некрасиво.Например, если вы хотите создать класс с десятью свойствами, вам необходимо реализовать соответствующие перегрузки.
Существует ли решение, позволяющее вам контролировать типизацию в массиве свойств?
...
Может быть неясно, почему это необходимо, но это только потому, что я не прикрепил весь свой код, а оставил только необходимые части.
Здесь вы можете увидеть, как это работает.