UNPKG

enum-union

Version:

TypeScript library that offers a flexible and declarative way to generate advanced enums and union types, supporting different casing styles, number-based enums, and enums from object types, enhancing type safety in TypeScript projects.

59 lines (58 loc) 3.48 kB
declare type Indices<N extends number, R extends readonly number[] = []> = R["length"] extends N ? R[number] : Indices<N, [...R, R["length"]]>; declare type EnumMap<T extends string> = { _type: "enum"; } & Record<T, T>; declare type LowercaseEnumMap<T extends string> = { _type: "lowercase"; } & Record<T, Lowercase<T>>; declare type UppercaseEnumMap<T extends string> = { _type: "uppercase"; } & Record<T, Uppercase<T>>; declare type CapitalizeEnumMap<T extends string> = { _type: "capitalize"; } & Record<T, Capitalize<T>>; declare type UncapitalizeEnumMap<T extends string> = { _type: "uncapitalize"; } & Record<T, Uncapitalize<T>>; declare type ConfigOptions = "enum" | "lowercase" | "uppercase" | "capitalize" | "uncapitalize"; declare type OmitType<T> = Omit<T, "_type">; declare type EnumConfiguration<T extends string, U extends string> = U extends "lowercase" ? LowercaseEnumMap<T> : U extends "uppercase" ? UppercaseEnumMap<T> : U extends "capitalize" ? CapitalizeEnumMap<T> : U extends "uncapitalize" ? UncapitalizeEnumMap<T> : EnumMap<T>; declare type EnumFromStrings<T extends string[], V extends number> = { _type: V; } & { [U in T[number]]: Indices<V>; }; export declare type Enum<T> = T extends { _type: infer U; } ? U extends "lowercase" ? Lowercase<string & T[keyof Omit<T, "_type">]> : U extends "uppercase" ? Uppercase<string & T[keyof Omit<T, "_type">]> : U extends "capitalize" ? Capitalize<string & T[keyof Omit<T, "_type">]> : U extends "uncapitalize" ? Uncapitalize<string & T[keyof Omit<T, "_type">]> : U extends number ? Indices<U> : T[keyof Omit<T, "_type">] : ExtractEnumObjValues<T>; declare type ExtractEnumObjValues<T> = T extends Record<string, infer U> ? U : never; export declare function Enum<D extends Record<string, string | number>>(firstOrConfig: D): { [K in keyof D]: D[K]; }; export declare function Enum<N extends number, T extends string>(firstOrConfig: N, ...items: T[]): [OmitType<EnumFromStrings<T[], N>>, EnumFromStrings<T[], N>]; export declare function Enum<T extends string>(firstOrConfig: "lowercase", ...items: T[]): [ OmitType<EnumConfiguration<T, "lowercase">>, EnumConfiguration<T, "lowercase"> ]; export declare function Enum<T extends string>(firstOrConfig: "uppercase", ...items: T[]): [ OmitType<EnumConfiguration<T, "uppercase">>, EnumConfiguration<T, "uppercase"> ]; export declare function Enum<T extends string>(firstOrConfig: "capitalize", ...items: T[]): [ OmitType<EnumConfiguration<T, "capitalize">>, EnumConfiguration<T, "capitalize"> ]; export declare function Enum<T extends string>(firstOrConfig: "uncapitalize", ...items: T[]): [ OmitType<EnumConfiguration<T, "uncapitalize">>, EnumConfiguration<T, "uncapitalize"> ]; export declare function Enum<T extends string>(firstOrConfig: T, ...items: T[]): [OmitType<EnumConfiguration<T, "enum">>, EnumConfiguration<T, "enum">]; export declare function Enum<N extends number, T extends string>(firstOrConfig: T, ...items: T[]): [ OmitType<EnumConfiguration<T, ConfigOptions>>, EnumConfiguration<T, ConfigOptions> ]; export declare type ExtractEnumType<T> = Enum<T>; export declare const makeEnum: typeof Enum; export declare function enumKeys<T extends ReturnType<typeof Enum>[0]>(enumObj: T): (keyof T)[]; export declare function enumKeyByVal<T extends ReturnType<typeof Enum>[0]>(enumObj: T, val: T[keyof T]): keyof T; export {};