31 lines
742 B
TypeScript
31 lines
742 B
TypeScript
export interface EnumItem {
|
|
val: string
|
|
txt: string
|
|
}
|
|
|
|
export type EnhancedEnum<T> = 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<T>(enums: T): EnhancedEnum<T> {
|
|
const e = enums as EnhancedEnum<T>
|
|
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
|
|
}
|