Код рефакторинга, чтобы не использовать typeof для ссылок - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть код ниже, который от Enum создает enum + функциональность для каждого его значения.

Я хотел бы избавиться от этих 2x "typeof", это выполнимо?

const TEST = createEnumComparator<typeof Test, SuperCompareEnums<typeof Test>>(Test, SuperCompareEnums);

Это то, что я хотел бы получить и сделать то же самое

const TEST = createEnumComparator<Test, SuperCompareEnums<Test>>(Test, SuperCompareEnums);

Или что-то вроде этого было бы лучшим

const TEST = createEnumComparator<SuperCompareEnums<Test>>(Test, SuperCompareEnums);

Весь код

class CompareEnums<T> {
  constructor(protected value: keyof T) {

  }

  public is(value: keyof T) {
    return value === this.value;
  }
}

class SuperCompareEnums<T> extends CompareEnums<T> {
  sayHello() {
    console.log('hello ' + this.value);
  }
}

interface Constructor<T> {
  new(...args: any[]): T;
}

function createEnumComparator<TObj1, TObj2 extends CompareEnums<TObj1>>(obj1: TObj1, obj2: Constructor<TObj2>): EnumAsComparator<TObj1, TObj2> {
  return _.mapValues<any>(obj1, value => new obj2(value)) as any;
}

// --------------------------------------------


enum Test {
  A = 'A',
  B = 'B'
}

const TEST = createEnumComparator<typeof Test, SuperCompareEnums<typeof Test>>(Test, SuperCompareEnums);

// --------------------------------------------
console.warn(1111111111111);
console.warn(TEST.A.is(Test.A), 1);
console.warn(TEST.B.is(Test.B));
console.warn(TEST.B.sayHello());
console.warn(TEST.A.is(Test.B));

// --------------------------------------------

type EnumAsComparator<TObj1, TObj2> = {
  [P in keyof TObj1]: TObj2;
};
...