// Even better version - simpler and more reliable export const createTypeSafeEnum = (arr: T) => { const enumObj = {} as any; arr.forEach((item) => { // Create uppercase key const key = item .toUpperCase() .replace(/[.\-\s]/g, "_") .replace(/[^A-Z0-9_]/g, ""); enumObj[key] = item; }); // Simple but effective type assertion return enumObj as { readonly [K in T[number] as K extends string ? Uppercase< K extends `${string}.${infer Rest}` ? Rest : K > extends infer UpperKey ? UpperKey extends string ? UpperKey extends `${string}_${string}` ? UpperKey : UpperKey extends Uppercase ? UpperKey : never : never : never : never]: K; } & { // Add index signature to prevent access to non-existent keys [key: string]: T[number] | undefined; }; }; // Most practical version - keeps it simple but effective export const createEnum = (arr: T) => { const enumObj = {} as Record; arr.forEach((item) => { const key = item .toUpperCase() .replace(/[.\-\s]/g, "_") .replace(/[^A-Z0-9_]/g, ""); enumObj[key] = item; }); return enumObj as { readonly [K in T[number] as K extends string ? Uppercase extends infer UK ? UK extends string ? UK : never : never : never]: K; }; }; // clean version with perfect type inference export const makeEnum = (arr: T) => { type ToUpperSnake = S extends `${infer A}.${infer B}` ? Uppercase extends `${infer C}` ? C extends string ? C : Uppercase : Uppercase : Uppercase; type EnumKeys = { [K in T[number]]: ToUpperSnake extends string ? ToUpperSnake : never; }[T[number]]; const enumObj = {} as Record; arr.forEach((item) => { const key = ( item.includes(".") ? item.split(".").pop()!.toUpperCase() : item.toUpperCase() ).replace(/[^A-Z0-9]/g, "_") as EnumKeys; enumObj[key] = item; }); return enumObj; }; export const createEnumFromArray = createEnum;