export interface EnumItem { val: string txt: string } export type EnhancedEnum = T & { // @ts-ignore [key in T[number]['val']]: T[number]['val'] } & { // @ts-ignore [key in `${T[number]['val']}Txt`]: T[number]['txt'] } & { // @ts-ignore of: (val: string) => T[number] | undefined // @ts-ignore txt: (val: T[number]['val']) => T[number]['txt'] } export function createEnum(enums: T): EnhancedEnum { const e = enums as EnhancedEnum for (let enumItem of enums as EnumItem[]) { // @ts-ignore e[enumItem.val] = enumItem.val // @ts-ignore e[enumItem.val + 'Txt'] = enumItem.txt } // @ts-ignore e.of = (val: string) => ((enums as EnumItem[]).find((item) => item.val === val)) return e }