Levi Botelho
Levi Botelho

Reputation: 25224

Typed enum instance in TypeScript

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

Answers (1)

aboersch
aboersch

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

Related Questions