Расширенный набор входных аргументов - PullRequest
0 голосов
/ 24 сентября 2019

Есть ли способ избавиться от перегрузки метода, когда вы хотите «разложить» массив входящих аргументов?

Например, у вас есть класс, который содержит конфигурацию свойства:

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;

Это работает!Но очень неудобно и некрасиво.Например, если вы хотите создать класс с десятью свойствами, вам необходимо реализовать соответствующие перегрузки.

Существует ли решение, позволяющее вам контролировать типизацию в массиве свойств?

...

Может быть неясно, почему это необходимо, но это только потому, что я не прикрепил весь свой код, а оставил только необходимые части.

Здесь вы можете увидеть, как это работает.

...