TypeScript 中的类型化枚举实例

Posted

技术标签:

【中文标题】TypeScript 中的类型化枚举实例【英文标题】:Typed enum instance in TypeScript 【发布时间】: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”类型的参数。

【问题讨论】:

请检查这是否适合您:***.com/questions/17380845/… @BalajiV 如果您阅读我的代码示例,您会发现这就是我正在做的事情。问题不是如何进行转换,而是如何键入函数参数。 【参考方案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

【讨论】:

以上是关于TypeScript 中的类型化枚举实例的主要内容,如果未能解决你的问题,请参考以下文章

从0开始的TypeScriptの三:类型系统 ·下

Typescript 中的枚举类型是啥?

TypeScript类型

带有接口的Typescript中的Json枚举?

TypeScript 之 基础类型

使用 `import type` 声明导入时,TypeScript 枚举不能用作值