【问题标题】:Typed enum instance in TypeScriptTypeScript 中的类型化枚举实例
【发布时间】:2017-08-19 22:23:28
【问题描述】:

我有以下方法将枚举的字符串实例转换为对象上相应的枚举成员:

function transformEnum<TBase>(base: TBase, member: keyof TBase, enumInstance: any) {
    base[member] = enumInstance[base[member]];
}

它是这样称呼的:

transformEnum(result, "day", DayOfWeek);

有没有办法输入enumInstance 变量?打字不一定是完美的,但至少在某种程度上限制它会很好。

我也试过了

function transform<T>(get: () => T, set: (x: T) => void, enumInstance: T) {
    set((enumInstance as any)[get()]);
}

但是当我这样称呼它时:

transform<DayOfWeek>(() => result.day, (x) => { result.day = x; }, DayOfWeek);

我明白了

[ts]“typeof DayOfWeek”类型的参数不可分配给“DayOfWeek”类型的参数。

【问题讨论】:

  • 请检查这是否适合您:stackoverflow.com/questions/17380845/…
  • @BalajiV 如果您阅读我的代码示例,您会发现这就是我正在做的事情。问题不是如何进行转换,而是如何键入函数参数。

标签: typescript types enums


【解决方案1】:
function transform<T, TKey extends keyof T>(get: () => TKey, set: (x: T[TKey]) => void, enumInstance: T) {
  set(enumInstance[get()]);
}

例子:

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

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 2022-09-23
    • 2012-10-09
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多