Open rimo030 opened 4 months ago
type _Enum<T extends readonly string[], N extends boolean = false, I extends any[] = []> = T extends readonly [infer F , ...infer R extends string[]] ? N extends true ? {readonly [K in Capitalize<F & string>] : I['length']} & _Enum<R, N, [...I, F]> : {readonly [K in Capitalize<F & string>] : F} & _Enum<R, N> : {} type Enum<T extends readonly string[], N extends boolean = false> = Omit<_Enum<T, N>, never>
import type { Equal, Expect } from '@type-challenges/utils' const OperatingSystem = ['macOS', 'Windows', 'Linux'] as const const Command = ['echo', 'grep', 'sed', 'awk', 'cut', 'uniq', 'head', 'tail', 'xargs', 'shift'] as const type cases = [ Expect<Equal<Enum<[]>, {}>>, Expect<Equal< Enum<typeof OperatingSystem>, { readonly MacOS: 'macOS' readonly Windows: 'Windows' readonly Linux: 'Linux' } >>, Expect<Equal< Enum<typeof OperatingSystem, true>, { readonly MacOS: 0 readonly Windows: 1 readonly Linux: 2 } >>, Expect<Equal< Enum<typeof Command>, { readonly Echo: 'echo' readonly Grep: 'grep' readonly Sed: 'sed' readonly Awk: 'awk' readonly Cut: 'cut' readonly Uniq: 'uniq' readonly Head: 'head' readonly Tail: 'tail' readonly Xargs: 'xargs' readonly Shift: 'shift' } >>, Expect<Equal< Enum<typeof Command, true>, { readonly Echo: 0 readonly Grep: 1 readonly Sed: 2 readonly Awk: 3 readonly Cut: 4 readonly Uniq: 5 readonly Head: 6 readonly Tail: 7 readonly Xargs: 8 readonly Shift: 9 } >>, ]