koSakano/type-challenges

472 - Tuple to Enum Object

Opened this issue · 0 comments

type FindIndex<T extends readonly any[], I, R extends any[] = []> =
  T extends readonly [infer A, ...infer B] ? [A] extends [I] ? R["length"] : FindIndex<B, I, [...R, any]> : -1;

type Enum<T extends readonly string[], N extends boolean = false> = {
  readonly [k in T[number]as `${Capitalize<k>}`]: N extends false ? k : FindIndex<T, k>;
}