Reputation: 25224
I have the following method which transforms a string instance of an enum to the corresponding enum member on an object:
function transformEnum<TBase>(base: TBase, member: keyof TBase, enumInstance: any) {
base[member] = enumInstance[base[member]];
}
It's called like this:
transformEnum(result, "day", DayOfWeek);
Is there any way to type the enumInstance
variable? The typing doesn't have to be perfect, but constraining it at least somewhat would be nice.
Alternatively I've tried
function transform<T>(get: () => T, set: (x: T) => void, enumInstance: T) {
set((enumInstance as any)[get()]);
}
But when I call this like so:
transform<DayOfWeek>(() => result.day, (x) => { result.day = x; }, DayOfWeek);
I get
[ts] Argument of type 'typeof DayOfWeek' is not assignable to parameter of type 'DayOfWeek'.
Upvotes: 2
Views: 2777
Reputation: 128
function transform<T, TKey extends keyof T>(get: () => TKey, set: (x: T[TKey]) => void, enumInstance: T) {
set(enumInstance[get()]);
}
Example:
enum DayOfWeek {
Monday, Tuesday, Wednesday, ...
}
type DayOfWeekKey = keyof typeof DayOfWeek;
class ClassWithDay {
day: DayOfWeekKey | DayOfWeek;
}
let c = new ClassWithDay();
c.day = "Monday";
transform(() => c.day as DayOfWeekKey, v => {c.day = v;}, DayOfWeek);
// c.day is now 0
Upvotes: 3