export abstract class HaxeEnum { // Following static members must be implemented static readonly enum: string = "Unimplemented" static readonly tag: string = "Unimplemented" static getEnumConstructs(): any[] { throw new Error("getEnumConstructs must be implemented") } getParams(): any[] { throw new Error("getParams must be implemented") } } export function createGenericHaxeEnum(name: string, tag: string | number, args: any[]): HaxeEnum { const derivedClass = class extends HaxeEnum { static readonly enum: string = name static readonly tag: string = tag as string args: any[] = args static getEnumConstructs(): any[] { if (typeof tag === "number") { const c = new Array(tag + 1).fill({}) c[tag] = { tag } return c } return [] } getParams(): any[] { return args } } const genericEnum = new derivedClass(); return genericEnum }