У меня есть код ниже, который от 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;
};