作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下方法将枚举的字符串实例转换为对象上相应的枚举成员:
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] Argument of type 'typeof DayOfWeek' is not assignable to parameter of type 'DayOfWeek'.
最佳答案
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 - TypeScript 中的类型化枚举实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43042549/
我是一名优秀的程序员,十分优秀!